做一些关于Verilog的简要笔记,方便日后快速复习,如有错漏希望您能够不吝赐教
1. 结构语句
initial语句在模块中只执行一次,常用于产生测试信号,或者赋初值
initial begin
sys_clk <= 1'b0;
sys_rst_n <= 1'b0;
#20 sys_rst_n <= 1'b1; //延时20ns后执行
#20 sys_rst_n <= 1'b0; //再延时20ns后执行
end
always语句在模块中一直不断地重复活动,由敏感列表中的边沿或电平判断块是否执行,列表中的每个条件用or连接。
边沿触发用于描述时序逻辑,电平触发用于描述组合逻辑。
组合逻辑:任何时候输出仅取决于该时刻的输入
时序逻辑:输出取决于当前输入以及电路原本的状态,即具备记忆能力
always @(a or b or c or d or e)begin
out = a ? (b+c) : (d+e);
end
//或者如下表达,@(*)表示对语句块内所有输入变量敏感
always @(*)begin
out = a ? (b+c) : (d+e);
end
2. 赋值语句
阻塞赋值b=a
在同一个always块中,后面的赋值语句是在前一个赋值语句结束后才开始赋值的。
表述组合逻辑
非阻塞赋值b<=a
在计算非阻塞赋值语句的RHS以及更新LHS期间,允许其他非阻塞赋值语句同时计算RHS和更新LHS。(RHS——right_hand_side)
只能用于initial和always等过程块中对寄存器类型(register)的变量进行赋值。
表述时序逻辑,仅在跳变沿时发生变量赋值。
注意:不要在一个块中同时使用两种赋值方式。且一个变量只能在一个always块中被赋值。
3. 条件语句
只能在过程语句块中使用,如initial、always
if_else
可以进行嵌套,也可以用if(a)begin....end
来包含多个语句。
且 0、x、z按照假处理
case
分支表达式值需要互不相同
表达式的位宽需要相等
casez不考虑z
casex不考虑z和x
如下举例:
reg [7:0] sel;
casez(sel)
8'b1100_zzzz : 语句1;
8'b1100_xxzz : 语句2;
default : 语句3;
endcase