时序模型:仿真器的时间推进模型,它反映了推进仿真时间和调度事件的方式。
1)门级时序模型:适用于分析所有的连续赋值语句,过程连续赋值语句,门级原语,用户自定义原语。
特点:任意时刻,任意输入变化都将重新计算其输出。假设已经存在一个门级时序模型,同时该模型产生的一个事件已被调度但还未执行,如果事件的结果将导致
一个新事件产生,仿真器会撤销对先前事件的调度,转而调度新事件。
适用于模拟电路中的惯性延时。适用于组合逻辑建模。
惯性延时:例如在一个与非门电路中,门延时5ns,那么任何小于这个延时值的输入变化都不会对输出产生影响。
写法:always @(a or b) begin #5 sum = a + b; end 起始时刻为T,T+5时刻再将此时刻的a+b计算赋值。(right)
always @(a or b) begin sum = #5 (a+b); end 起始时刻为T,T+5时刻再将T时刻a+b的值赋值给sum。
assign #5 B = ~ A; //B是A延时5单位后的值。更新A和B都发生在5单位后。(right)
assign B = #5 ~ A; //B是A延时5单位后,5单位前的值。更新A发生在刚开始,更新B发生在5单位后。
假设Clk时钟为200ns,则 assign #800 Clk_delay = Clk; 语句执行。 Clk_delay将一直保持未初始化的值,因为Clk的周期200ns的变化会一直刷新事件,使得#800的事件一直执行不了。
2)过程时序模型:适用于initial, always, 。
特点:敏感表只是输入的一个子集。假设寄存器的一个更新事件已经被调度,如果再调度同一个寄存器的另一个更新事件,即使在同一时刻,前一个事件也不会被
取消。
适用于模拟电路中的传导延时。适用于时序逻辑建模。
传导延时:金属线上的传输延时,D触发器中clk-to-Q延时。
写法:always @(posedge clk or negedge rst_n) begin
if(~rst_n) A <= 0;
else A <= #2B;
end //B的值在延时2个单位后,将0时刻时的值赋值给A,期间B的变化不会影响A。(right)
always @(posedge clk or negedge rst_n) begin
if(~rst_n) A <= 0;
else #2 A <= B;
end //B的值在延时2个单位后,将2时刻时的值赋值给A,期间B的变化不会影响A。
原文:http://www.cnblogs.com/-9-8/p/4396029.html