|  | 
 
 发表于 2017-6-7 08:10:42
|
显示全部楼层 
| 如果依照上述的圖來寫RTL Code的話,如下所示:
 // RTL Code
 module gate_clk_dff(
 input
 [1:0]
 D_in,
 output
 reg [1:0]
 D_out,
 input
 CLK,
 input
 EN);
 
 reg
 en_lat;
 always@(CLK)
 begin
 if(~CLK)
 en_lat <= #1 EN;
 else
 en_lat <= #1 en_lat;
 end
 
 assign GCLK = CLK && en_lat;
 
 always@(posedge GCLK)
 begin
 D_out <= #1 D_in;
 end
 endmodule
 
 // TestBench
 module tb_gate_clk_dff();
 reg
 [1:0]
 D_in;
 reg
 EN;
 reg
 CLK;
 wire
 [1:0] D_out;
 always
 
 begin
 
 #10 CLK <= 1'b1;
 
 #10 CLK <= 1'b0;
 
 end
 
 
 gate_clk_dff gate_clk_dff(
 
 .D_in (D_in),
 
 .D_out(D_out),
 
 .CLK
 (CLK),
 
 .EN
 (EN)
 
 );
 
 
 initial
 
 begin
 
 CLK = 1'b0;
 
 EN = 1'b0;
 
 D_in = 2'b10;
 
 repeat(2) @(posedge CLK);
 
 @(negedge CLK);
 
 EN = 1'b1;
 
 repeat(3) @(posedge CLK);
 
 $stop;
 
 end
 
 
 endmodule
 
 
 至於會有hold time的問題應該是你用Gate Clock,所以軟體在算Timing 的時候會比較不好算.
 | 
 |