SystemVerilog 采樣和數據驅動


modport是限制信號傳輸方向的,避免端口連接的錯誤。

可以在接口聲明clocking(時序塊)和采樣的時鍾信號,用來做信號的同步和采樣。

clocking塊基於時鍾周期對信號進行驅動或者采樣的方式,使得testbench不在苦惱於如何准時及時的對信號驅動或者采樣,消除了信號競爭的問題。(解決delt-cycle,不用人為的添加delay)

自己用的時鍾塊都是出現在interface里面,但是規定可以使得他在module和interface和program中使用。

clocking中列舉的信號不是自己定義的,而是由interface或者其他聲明clocking的module定義的。

clocking bus @(posedge clock1);//定義了一個clocking塊bus由clock1的上升沿驅動和采樣。

  default input #10ns output #2ns;//clocking的所有信號默認情況下會在clocking時間(clock1上升沿)前10ns來對其進行輸入采樣,在時間的后面2ns對其進行輸出驅動。

 

 #0是包含很多個delt-cycle的。

新的事件會對默認的事件進行覆蓋。

input data,ready,enable;//采用的默認輸入事件,即提前10ns

output negedge ack;//驅動ack事件是clock1的下降沿但是仍然延后2ns,覆蓋了原有的默認輸出事件(上升沿后的2ns)

input #1step addr;//自身的定義采樣事件,clock1上升沿前的1step。

//1step會是的采樣發生在clock1上升沿的上一個時間片的采樣區域,可以保證采樣到的數據是上一個時鍾周期的數據。

input是在之前,output是在之后。

endclocking

 

 

習題:

 

 答案:C

不同的clocking可以聲明不同的方向

利用clocking的采樣:

module clocking1;

bit vld;

bit grt;

bit clk;

clocking ck @(posedge clk);

default :input #3ns output #3ns;

input vld;

output grt;

endclocking

initial forever #5ns clk < =~clk;

iinitial begin :drv_vld

  $display("   ");

  #3ns vld = 1; $display(" ");

  #10ns vld=0; $display(" " );

  #8ns vld = 1;$display(" ");

end

initial forever 

  @ck $display("  .....",vld,$time);

initial forever 

  @ck $display("   ..",ck.vld,$time-3 );//此處調用了ck塊進行的采樣

endmodule

在這個例子里面@ck等價於@(posedge clk)

 

 建議使用clocking塊進行采樣

例子:用clocking塊做驅動

module clocking2;

  bit vld;

  bit grt;

  bit clk;

clocking ck @(posedge clk);

default input #3ns output #3ns;

input vld;

output grt;

endclocking

initial forever #5ns clk<=~clk;

initial begin:drv_grt

  $display("...",$time,grt);

@ck ck.grt<=1;

  $display(".....",$time);

@ck ck.grt<=0;$display("   ",$time);

@ck ck.grt<=1;$display("  ",$time);

end

initial forever

@grt $display(" ..",$time,grt);

endmodule

可以從根本上消除掉采樣產生的競爭

 


免責聲明!

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



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