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
可以從根本上消除掉采樣產生的競爭
