电子说
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条评论
快来发表一下你的评论吧 !