vcs 仿真中遇到的verilog 延時問題


 

在項目后仿的過程中,由於后端提供的網表並非完整的網表,而是分模塊提供的獨立網表。所以后仿是在仿真環境中既有rtl代碼,又有網表。這種情況下rtl 模塊與網表模塊之間的接口存在信號的hold time無法滿足的情況。所以需要將rtl給到網表的輸入信號做一個delay再輸入到網表中。在這個過程中研究了一下verilog中的延時問題。

no bb,show me your code.

 module test(input in, output a,output b,output c,output d,output e,output f,output g);
reg a;
reg b;
reg c;
reg d;
   
always@(*) begin
 #5 a=in;
 end
  
 always@(*) begin
 b= #5 in;
 end
  
 always@(*) begin
 #5 c<=in;
 end
  
always@(*) begin
d <=#5 in;
end
  
  assign #5 e=in;
  assign f=in;
  assign #1 g=in;
  
 endmodule

 下面是以上代碼再vcs下的仿真波形:

 

 

 

首先看信號a,c

 

 

信號a,c都是再always塊被賦值,敏感條件是*,也就是只要輸入信號in變化就會觸發對應always塊的執行,該always塊內部先是執行#5,等待5個時間單位,然后把in的當前值(5ns時刻的值)賦給a,c。也就是在0時刻該always塊觸發以后等待5ns,將5ns時刻的in值0賦值給a,c.在always內部的#5等待5ns的這個時間段以內,輸入信號in的任何變化都不會被響應。下次觸發always的條件就是5ns后in的再次跳變。

再來看信號b,d

 

 

 #5放在賦值符號之后,不同在於b采用的阻塞賦值,d采用的非阻塞賦值。兩者都是將5ns之前的in值賦給b,d。但是阻塞賦值的情況信號b會忽略等待5ns這段時間的輸入信號的變化。換個說法就是in信號的跳變觸發always塊,記錄當前in值,然后等待#5,同時在等待的過程中忽略in的變化,等#5時間一到將之前記錄的in值賦給b;信號d則不同,in信號的跳變觸發always塊,記錄當前in值,然后等待#5,但是在等待#5的過程中也會記錄in的變化。這種情況相當於信號d是將in整體后移了5ns。

 

遺留問題

 assign #5 e=in;

 https://blog.csdn.net/qq_37590544/article/details/125028546


免責聲明!

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



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