【发布时间】:2020-09-18 01:02:32
【问题描述】:
我正在尝试编写一个时钟门控逻辑,它只允许数据在 posedge write_clk_en 处通过。代码在 EDA 操场上正确编译,但输出不符合预期。所以根据代码,
@ (posedge write_clk_en)begin
data_in[3] <= 1'b1;
end
在这种情况下 write_clk_en 被禁用,因此 data_in[3] NBA 应该停止并等待下一个有效的 posedge(这里是 write_clk_en 的下一个 posedge),应该写入 data_in[3]。但这并没有发生,而是门控时钟周期也在考虑之中,即使 write_clk_en 被门控到第 4 个脉冲,NBA 分配也会发生。可能是什么问题?.波形显示在这里。
sv 代码:
module tb;
logic [4:0] data_in;
logic write_clk;
logic write_clk_en;
logic write_clk_mod;
logic [5:0] write_clk_init;
always//write_clk 500M
begin
write_clk =0;
#10 write_clk = 1;
#10 write_clk = 0;
end
initial begin
$dumpfile("dump.vcd");
$dumpvars;
#10000 $finish;
end
initial begin
data_in=5'b00000;
write_clk_init = 6'b000000;
write_clk_mod=0;
end
initial begin
write_clk_init =6'b110111;
end
initial begin
repeat (3) begin
@(posedge write_clk)begin
if(write_clk_init[0]==1 || write_clk_init[0]==0)
write_clk_mod<=write_clk_init[0];
end
@(posedge write_clk)begin
if(write_clk_init[1]==1 || write_clk_init[1]==0)
write_clk_mod<=write_clk_init[1];
end
@(posedge write_clk)begin
if(write_clk_init[2]==1 || write_clk_init[2]==0)
write_clk_mod<=write_clk_init[2];
end
@(posedge write_clk)begin
if(write_clk_init[3]==1 || write_clk_init[3]==0)
write_clk_mod<=write_clk_init[3];
end
@(posedge write_clk)begin
if(write_clk_init[4]==1 || write_clk_init[4]==0)
write_clk_mod<=write_clk_init[4];
end
@(posedge write_clk)begin
if(write_clk_init[5]==1 || write_clk_init[5]==0)
write_clk_mod<=write_clk_init[5];
end
end
end
always @ (*) begin
write_clk_en = write_clk & write_clk_mod;
end
initial begin
@ (posedge write_clk_en)begin
data_in[0] <= 1'b1;
end
@ (posedge write_clk_en)begin
data_in[1] <= 1'b1;
end
@ (posedge write_clk_en)begin
data_in[2] <= 1'b1;
end
@ (posedge write_clk_en)begin
data_in[3] <= 1'b1;
end
@ (posedge write_clk_en)begin
data_in[4] <= 1'b1;
end
end
endmodule
【问题讨论】:
-
看起来您在wire_clk_en 上遇到了故障。很可能是因为您在生成 write_clk_mod 时过度使用了 nbas。在那里使用阻塞分配。
标签: verilog system-verilog clock hdl