|
发表于 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 的時候會比較不好算. |
|