为求全面完整,叙述比较长,希望你能耐心看完,起码我都耐心打完了,呵呵~
先扼要答题:
(1)#1是延时语句,不能被综合,只能用于仿真。
至于延时多少则取决于你所定义的时钟,例如:
assign #1 A_xor_wire = eq0 ^ eq1; // `timescale 1ns/100ps
就表示该异或门延时为1ns,也就是说从输入端信号变化到输出端体现变化需要1ns的时间。(其中1ns表示延时单位,100ps表示时间精度,即编译器所能接受的最小仿真时间粒度。 )
(2)ud_cnt #(SIZE, ID) cnt (.clk(clk),....) 是带参数值的模块引用,模块实例语句自身包含有新的参数值。你没有贴出完整代码,我还是抄书上例子给你讲,例如:
…
HA #(5,2) Hal(New, NewB, NewC);
//第1个值5赋给参数AND_DELAY,该参数在模块HA中说明。
//第2个值5赋给参数XOR_DELAY,该参数在模块HA中说明。
…
module HA(A,B,S,C);
input A,B;
output S,C;
parameter AND_DELAY =1, XOR_DELAY =2;
assign #XOR_DELAY S = A^B;
assign #AND_DELAY C=A&B;
endmodule
…
//模块实例语句
HA h2 (.A(Cin), .S(Sum), .B(S1), .C(C2)); //通过端口与信号的名字关联
…
仔细对比看看,想想,我想你应该明白了吧?
再扩展深化:
实际上,电路对不同的信号跳变表现出的延时往往并不一致,这些延时模型包括上升沿延时(输出变为1)、下降沿延时(输出变为0)、关闭延时(输出变成Z,高阻态)和输出变成X的延时。比如:
assign #(1,2) A_xor_wire = eq0 ^ eq1;
assign #(1,2,3) A_xor_wire = eq0 ^ eq1;
第一句表示上升延时为1ns,下降延时为2ns,关闭延时和传递到X的延时取两者中最小的,即1ns。
第二句表示上升延时为1ns,下降延时为2ns,关闭延时为3ns,传递到X的延时取1、2、3中最小的,即1ns。
在一些电路模型中,延时分为最大、典型和最小3种情况。连续赋值语句中的延时也可以采用min:typ:max的格式来表示,如:
assign #(4:5:6, 3:4:5) A_xor_wire = eq0 ^eq1;
表示上升延时的min:typ:max为4:5:6,下降延时的min:typ:max为3:4:5。
你代码中类似“RESETn <= #1 1'b0;”的语句属于“在非阻塞赋值语句的右式(RHS)中增加延时”,可以精确的模拟电路中的传导延时,是一种有意义的、健康的代码风格。以
always (a or b) begin
SUM <= #5 a+b
end
为例,其执行过程是这样的:
首先计算a+b的值,然后将“相加结果赋予sum”的更新事件调度到T+5ns以后执行,此后,a和b上的任何变化都将导致always的再次执行,也就是说a和b上的任何变化都不会被忽略,而总是在5ns以后体现在SUM上。
此外,不推荐在阻塞赋值语句中增加延时(#5 SUM=a+b; 和 SUM = #5 a+b;),也不推荐在非阻塞语句的左式中增加延时(#5 SUM <= a+b;)。详见《设计与验证:Verilog HDL》的8.5.4节。
而在连续赋值语句中,只有一种延时语法是合法的,如下:
assign #5 B=~A;
这种延时精确地模拟了电路中的惯性延时。A信号上任何小于5ns的变化都将被过滤掉,而不会反映到B信号上。
参考资料:《设计与验证:Verilog HDL》《Verilog_HDL硬件描述语言.J.Bhasker著.徐振林等译》