Verilog之delay的兩種用法(inter/intra)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM