SystemVerilog 語言部分(二)

JustKeen發表於2021-05-31

介面interface:

既可以設計,也可以用來驗證。

驗證環境:interface使得連線變得簡單不容易出錯。

interface可以定義埠,單雙向訊號,內控部使用initial always task function

interface 可以在硬體環境和軟體環境中傳遞。也可以作為軟體方法的形式引數

可以把interface看做“插排”。

testbench<--->interface<----->arbiter

 

 通過interface name+ . +logic

通過$finish在testbench結束模擬。

在interface的埠列表之中只需要定義:時鐘,復位等公共訊號,或者不定義任何埠訊號,轉而在變數列表中定義哥哥需要跟DUT和TB連線的logic的變數。為了簡單易用,推薦使用logic的定義變數。

interface也可以進行引數化

習題:

 

答案:ABCD

 module中可以例化module,interface

interface可以例化interface,但是不能例化module

 

 

2.取樣和資料驅動

  RTL的競爭解決方法:

    1.使用非阻塞賦值語句

    2.訊號進行延遲來解決同步的問題

 

 阻塞賦值,在上例中 a 被設計為4個暫存器,但是 b = a 在同一拍子中b被設計成導線的形式,不是暫存器的形式。

在進行模擬時候為了避免時序電路中時鐘和驅動訊號的時序競爭問題,我們需要給出儘量明確的驅動時序和取樣時序。

預設情況下時鐘對於組合電路的 驅動會新增一個無限小的delta-cycle,而且該延遲無法用絕對實踐單位衡量,它要比最小的時間單位精度還小。

一個時間片:time-slot 可以發生很多事

在模擬時候run0,讓模擬器跑一個delta-cycle的時間。

競爭的問題:

timescale 1ns/1ns

module race1;

 

bit clk1,clk2;

bit rstn;

logic[7:0] d1;

 

initial begin//generate clk1

  forever #5 clk1< = ~clk1;

end

//clk2 generate

always@(clk1)

clk2<=clk1;//即使clk2與1完全同步,但是也有delt-delay

initial begin

  #10 rstn <=0;

  #20 rstn<=1;

end

//mini counter 

always@(posedge clk1,negedge rstn)begin

if(!rstn)

d1<=0;

else 

  d1<=d1+1;

end

//clk1,2POSedge print data d1

always@(posedge clk1)

  $display("%0t ns d1 value is 0x%0x",$time,d1);

always@(posedge clk2)

  $display("%0t ns d1 value is 0x%0x",$time ,d1);

endmodule

 

 NB的題,這裡應該是A.2

使用列印的資料比用模擬觀察波形得到的資料要準確。

 

 

 

 

如何避免取樣的競爭問題?

(1)在驅動時,新增相應的人為延遲。模擬真實的延遲

同時加大clk與變數之間的延遲,提高DUT使用訊號時的準確度和TB

取樣訊號時的可靠性。

(2)在取樣時間前的某時段中進行取樣。

 

相關文章