电子说
1.$width语法
在verilog中,$width是时序检查函数,用于检查脉冲的位宽是否符合要求。
$width ( reference_event , timing_check_limit , threshold [ , [ notify_reg ] ] ) ;
reference_event代表一个上升沿(下降沿)触发事件。
语法中隐形地表达了data_event。
data event = reference event signal with opposite edge。
如果reference_event为上升沿,则最近的一个下降沿是data_event,两者的时间间隔为脉冲宽度。
如果reference_event为下升沿,则最近的一个上降沿是data_event,两者的时间间隔为脉冲宽度。

图1:event示意图[1]

图2:参数说明[2]

•期望的场景:脉冲宽度 >= limit
•不期望的场景:
○产生timing violation场景的:threshold < 脉冲宽度< limit
○不产生timing violation场景的:脉冲宽度

图2:width检测时序示意图[1]
NOTE:很多时候threshold的值为0.
2.案例说明
此案例中,使用的仿真工具为VCS,limit为 6000ps。小于6000ps的脉冲位宽均产生了Timing violation。
threshold为2000ps,位宽小于threshold的脉冲也产生了Timing violation,此处检查比协议要求得更加严格。

"/auto/asic/design/try/top/rtl/width_tb.v", 34: Timing violation in width_tb
$width( posedge clk:1000, : 2000, limit: 6000 );
"/auto/asic/design/try/top/rtl/width_tb.v", 34: Timing violation in width_tb
$width( posedge clk:5000, : 10000, limit: 6000 );
$finish called from file "/auto/asic/design/try/top/rtl/width_tb.v", line 10.
$finish at simulation time 100000
V C S S i m u l a t i o n R e p o r t
module width_tb;
reg clk;
initial begin
$fsdbDumpfile("width_tb.fsdb");
$fsdbDumpvars(0, width_tb);
#100;
$finish;
end
initial begin
clk = 1'b0;
#1;
clk = 1'b1;
#1;
clk = 1'b0;
#3;
clk = 1'b1;
#5;
clk = 1'b0;
#5;
clk = 1'b1;
#10;
clk = 1'b0;
#5;
clk = 1'b1;
#15;
clk = 1'b0;
end
specify
$width(posedge clk,6,2);
endspecify
endmodule
全部0条评论
快来发表一下你的评论吧 !