verilog語言中有兩種延遲方式:inter-delay和intra-delay,關於inter和intra。這兩個英文前綴都有“內部,之間”的意思,但又有所不同。inter表達不同事物之間,intra表達同類事物之間,兩者具體的含義請細細體會:)。以阻塞式賦值為例(block assignment):
1.inter-delay的表達式為:
#delay-value a=b+c;
先說說阻塞式賦值語句執行的一般過程:
block assignment方程的RHS先估值(evaluation)接着將結果賦值給LHS,就是assignment;簡單來說就是先evaluation再assignment。對於阻塞賦值,這兩個過程是一氣呵成的(當然是在沒有intra-delay的情況下),體現了“block”的含義。
回到這句話的含義上來,inter-delay要求賦值語句在執行之前先延遲一個delay-value的仿真時間,然后再執行上述的兩個過程,完成一次語句賦值。就是說inter-delay只是將這個賦值方程的執行時間整體延遲了,不會對表達式本身的執行過程產生影響。
2.intra-delay的表達式為:
a = # delay-value
b+c;
對於intra-delay可以將它理解為是這條語句的一個部分,當這條語句被執行時刻,仿真器以此時刻的b和c的值進行估值,然后等待delay-value的仿真時間,再將值assignment給a。注意:在等待的delay-value這段時間內,b/c的任何變化將是被忽略的,就是說這個賦值方程的LHS在這段時間內不會再估值即使b/c的值有變化!
對於intra-delay,它用於對實際電路的interial delay進性建模。至於什么是電路元件的interial delay這里就暫時不做介紹了。
有了上述解釋,下面這兩段代碼的區別就不言自明了(代碼來自論文:Correct Methods For Adding Delays To Verilog Behavioral Models)
module adder_t7a (co, sum, a, b, ci);
output co;
output [3:0] sum;
input [3:0] a, b;
input ci;
reg co;
reg [3:0] sum;
reg [4:0] tmp;
always @(a or b or ci) begin
#12 tmp = a + b + ci;
{co, sum} = tmp;
end
endmodule
module adder_t7b (co, sum, a, b, ci);
output co;
output [3:0] sum;
input [3:0] a, b;
input ci;
reg co;
reg [3:0] sum;
reg [4:0] tmp;
always @(a or b or ci) begin
tmp = a + b + ci;
#12 {co, sum} = tmp;
end
endmodule