Verilog 语句

可综合语句

Module ... endmodule

Module(clk,a,b,c,d);
input clk;
input [2:0] a,b;
output b;
inout e;
endmodule
  1. module 括号声明所有输入和输出信号。不要忘记 ;
  2. 模块里要声明所有输入和输出:
    • input [2:0] a; 表示端口 a 是 2bit 的 wire 型
    • output b 表示 1bit 的 wire 型
    • inout 是双向端口

parameter

parameter 声明常量。eg,parameter a = 3'b101;

wire, reg

  • inputoutput 只能是 wire型 。
  • inout 可以是 wire 也可以是 reg 型。

reg 是寄存器,定义的信号通常会综合成一个寄存器。 wire`则是两个 reg 之间的连线。

wire 型赋值有:

  1. wire a; 定义一个 wire 信号
  2. wire b = c; 给 b 连续赋值
  3. wire b = 2'b11; 赋值给 b 一个多bit的 wire 信号
  4. wire [3:0] c; 定义一个 4bit 的 wire 信号

reg 型赋值有:

  1. reg a; 定义一个 reg 信号
  2. reg b = 2'b01; 定义 b 并赋初值
  3. reg [3:0] c; 定义一个 4bit 的 reg 信号。可以赋初值, reg [3:0] c = 4'b0110;
  4. reg [3:0] d [2:0] 定义一个二维的,3 个 4bit 的reg 信号。

assign

asssign a = b;

连接 a 和 b 信号,或者给 a 赋值

begin ... end

多语句定义,顺序块

begin:a1 //块名
end
begin
end

always

always@(*) begin ... end

只要条件满足,循环执行。
敏感表取 posedge/negedge 上升沿/下降沿,电平信号触发,可以是多个条件,用 andor

()?():()

用的很多。

判断条件 : 判断为真执行此语句 : 判断为加执行此语句

function ... endfunction

  • 不能包含有时间控制语句,# @ wait 等。

  • 函数定义只能在模块( module )中,不能在过程块( always initial )中

  • 函数中不能出现过程块语句

  • 函数内部可以调用函数,不能调用任务

  1. 函数的定义
founction [3:0] fc; //函数返回值位宽不指定时为1, fc 是函数名
input [3:0] A, B; //定义输入变量,指定位宽和类型。至少要有一个输入端。可以是双向端口
reg S, Cout; //用到了 S 和 Cout 寄存器变量
begin
//函数体
end
endfounction
  1. 函数的调用

fc(A, B)

函数名(输入端口) 调用的参数只有输入端口

task ... endtask

  • 任务可以调佣任务(包括本身),也可以调用函数

  • 可以包含时间语句,比如用定时,repeat(8) @(posedge clock); 等待8个上升沿

  • 可以没有输入,输出等端口,与函数不同(至少一个输入端口)

  • 内部不能有过程块(always initial)

  1. 任务的定义
task t0;
input a, b;
inout c;
output d, e;
begin
执行语句;
end
endtask
  1. 任务的调用

task t0(输入端口, 输出端口, 双向端口) 与上述顺序一致

define

`define NUM 3'd5

定义常量,注意没有分号

if ... else

if(判断语句1) //分支1
else if(判断语句2) //分支2
else(判断语句3) //分支3
begin //多语句
end

case ... endcase

case(a) //a 是要判断的变量
3'b000 :执行语句1;
取值2 :执行语句2;
取值3, 取值4 :执行语句3;
defualt:无上执行此语句;
endcase

for

for(a=16'b01; a<10; a = a+1)
begin
end
  1. a 取初值
  2. 判断 a>10 ,逻辑为 1 执行下方语句
  3. 再执行 a=a+1 ,判断是否执行,不断循环。

generate

repeat

repeat(循环次数) 执行语句; 或者 repeat(判断语句) begin ... end

循环次数可以是常量、变量、表达式。

while

while(表达式) begin ... end

表达式成立则执行循环语句

不可综合语句

initial

forever

forever 语句; 或者 forever begin ... end 常用来产生周期性波形。必须写在 initial 块中

fork

time

wait

delays

本文作者:accumulagain

本文链接:https://www.cnblogs.com/accumulagain/p/17173825.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   accumulagain  阅读(312)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开