Verilog语法小结(1)

  1. 逻辑综合忽略延时信息

比如”# 10 a = 1’b1;”在逻辑综合的时候会将延时信息忽略。
2. always语句的规则:重复执行always后的语句

如果always后接”@(posedge clk)”,当执行到这时,always语句块的进程被挂起来,直到满足”posedge clk”条件,执行always块中的语句。然后always块会马上重复执行,到”@(posedge clk)”又被挂机,等待被激活
3. reg变量不代表映射成寄存器,而是在仿真时需要保存值

众所周知,在过程语句中的左值都要是reg类型,但其并不一定会被映射成寄存器。这个寄存器变量的实际意义是在仿真的时候保持它的值,就是寄存器变量在仿真时占据一定的内存空间。

1
2
3
4
always(a,b)
begin
c = a & b;
end

当a,b的值不变的时候,c的值也不会变,那么就需要保存c的值,所以c定义成reg寄存器变量。
4. 过程连续赋值

assign - deassign:对寄存器变量强制赋值和放开

force-release: 对寄存器和线网进行强制赋值和放开

1
2
3
4
5
6
7
8
9
always@(Clr)
begin
if(!Clr)
assign o = 1'b0; //清零,将o强制赋值为0,d的值对o无效
else
deassign o; //放开
end
always@(posedge clk)
o <= d;
  1. 模块例化时端口属性

与input相连的可以是线网也可以是寄存器类型。

与output相连的一定是线网

与inout相连,输入从一个线网来,输出驱动到一个线网

  1. case 和if –else建模是无优先级的

  2. 连续赋值

wire在定义的时候可以给赋值,这里算连续赋值,与assign相同。

1
wire tmp = data_i;

  1. 在描述仿真激励的时候可以使用for循环,但是在RTL级编码时要慎用for

综合工具会将for循环展开为所有变量情况的行为,每个变量独立占用寄存器资源,不利于硬件资源的复用。

相反,如果有些硬件资源确实不能复用的话,用for循环会增加代码的可读性。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!