|
`timescale 1ns/10ps `celldefine module DFR(C,D,XR,XQ,Q); input C; input D, XR; output XQ, Q; reg NOTIFIER;
not (IO_CLEAR,XR); udp_dff(NET0104,D,C,IO_CLEAR,1'B0,NOTIFIER); not (XIQ,NET0104); buf (Q,NET0104); not (XQ,NET0104);
specify specparam tplhcxq=0.74:0.74:0.74, tphlcxq=0.61:0.61:0.61; (posedge C *> (XQ -: D)) =(tplhcxq,tphlcxq); (posedge C *> (Q +: D)) =(0.51,0.64); (negedge XR *> (XQ +: 1'b1)) = (0.38:0.42:0.47,0); (negedge XR *> (Q -: 1'b1)) = (0,0.28); $setup(posedge D, posedge C &&& XR, 0.25:0.25:0.25,NOTIFIER); $setup(negedge D, posedge C &&& XR, 0.12:0.12:0.12,NOTIFIER); $hold (posedge C &&& XR, posedge D, -0.11:-0.11:-0.11,NOTIFIER); $hold (posedge C &&& XR, negedge D, 0.035:0.035:0.035,NOTIFIER); $recovery(posedge XR, posedge C &&& D, -0.23:-0.23:-0.23,NOTIFIER); $removal(posedge XR,posedge C &&& D, 0.36:0.36:0.36,NOTIFIER); $width(posedge C, 0.4:0.74:0.74,0,NOTIFIER); $width(negedge C, 0.28:0.56:0.56,0,NOTIFIER); $width(negedge XR,0.17:0.47:0.47,0,NOTIFIER); endspecify endmodule `endcelldefine primitive udp_dff(out,in,clk,clr,set,NOTIFIER); output out; input in,clk,clr,set,NOTIFIER; reg out; table // in clk clr set NOT : Qt : Qt+1 0 r ? 0 ? : ? : 0 ; 1 r 0 ? ? : ? : 1 ; 1 * 0 ? ? : 1 : 1 ; 0 * ? 0 ? : 0 : 0 ; ? f ? ? ? : ? : - ; * b ? ? ? : ? : - ; ? ? ? 1 ? : ? : 1 ; ? b 0 * ? : 1 : 1 ; 1 x 0 * ? : 1 : 1 ; ? ? 1 0 ? : ? : 0 ; ? b * 0 ? : 0 : 0 ; 0 x * 0 ? : 0 : 0 ; ? ? ? ? * : ? : x ; endtable endprimitive
//testbench
module testbench; reg C,D,XR; wire XQ,Q; DFR df (C,D,XR,XQ,Q); initial begin C=0; XR =1; D=0; #0.5 D=1; #1.48 D=0; #1.48 D=1; #1.48 D=0; #1.48 D=1; #1.48 D=0; #1.48 D=1; #1.48 D=0; #1.48 D=1; #10 $finish; end always #0.74 C=~C; initial begin $dumpfile("dfr.fsdb"); $dumpvars; end endmodule
上述代码,用 verilog 命令直接跑的 出现的 C (CLK) 信号 在 0.74+1.48时才反转,而不是在 0.74处? 狂晕中 (此时, C, D到XQ,都是 0.74, 当改动其中任何一个,都不会出现任何问题)
|
|