1. Testbech总是用reg去驱动DUT的input端口,因为需要在仿真期间设置和保持输入端的值(例如在initial中设置初值,在always中设置激励值);
2. 避免对局部reg在定义时赋值,尽管这在计算机语言中很常见。例如:
always @(...) begin : XXX
reg c = 0;
c = ...
end
上面的代码中,定义时赋值会使得c仅在初次进入always时被赋值为0,其后的值因reg特性而得以保留,从而综合工具(至少quartus)会综合出组合环路。改成如下形式即可:
reg c;
c = 0;
c = ...
modelsim甚至拒绝编译局部reg定义时赋值的代码。
3. 可以在always语句中给reg赋默认值
always @(...) begin
c = 1; // c is a reg
if(condition)
c = 0;
end
这样即使没有else也不会综合出环路。(VHDL的process语句也可采用这种写法)
4. in/out/reg等等可直接写在端口列表中,例如:
module(input clk, input[3:0] preset, output reg[3:0] cnt);
5. always begin/end中,“=”是阻塞式赋值,"<="是并发式赋值。所以:
always @(posedge clk) begin
d1 = d0;
d2 = d1; // 阻塞赋值,两条语句依次执行完毕后(d2=d1)等待下一个clk,对应综合结果一级锁存
d3 <= d0;
d4 <= d3; // 并发赋值,两条语句(在同一个时钟边沿)并发执行,对应综合结果二级并行锁存
end
综合工具(至少quartus)拒绝综合always fork/join。