Verilog 在时钟下降沿写入寄存器:代码中存在问题

Verilog 在时钟下降沿写入寄存器:代码中存在问题,verilog,clock,cpu-registers,flip-flop,Verilog,Clock,Cpu Registers,Flip Flop,我为一个有4个寄存器(每个32位)的寄存器文件编写了Verilog代码 预期结果写入寄存器文件应在时钟下降沿进行。传递到寄存器文件的时钟是regClk(选通时钟)。请忽略门控时钟会产生问题的事实,因为这是一个作业,我必须使用这个时钟 问题如时钟图所示,在t=10时写入reg0(regClk[0]的下降沿)。但在t=10之后,没有下降沿,但仍然会在t=18时写入reg0。类似的模式一直沿用到reg4。每当reg_n有下降沿时,即使其时钟中没有下降沿,也会将相同的值写入reg_n-1 我附上代码和时

我为一个有4个寄存器(每个32位)的寄存器文件编写了Verilog代码

预期结果写入寄存器文件应在时钟下降沿进行。传递到寄存器文件的时钟是regClk(选通时钟)。请忽略门控时钟会产生问题的事实,因为这是一个作业,我必须使用这个时钟

问题如时钟图所示,在t=10时写入reg0(regClk[0]的下降沿)。但在t=10之后,没有下降沿,但仍然会在t=18时写入reg0。类似的模式一直沿用到reg4。每当reg_n有下降沿时,即使其时钟中没有下降沿,也会将相同的值写入reg_n-1

我附上代码和时钟图:

具有异步清除功能的DFF

module dff(q,d,clk,reset);
    input d,clk,reset;
    output q;
    reg q;
    always @(negedge clk , posedge reset)
    begin
        if(reset)
            q<=1'b0;
        else
            q<=d;
    end
endmodule

忽略门控时钟会产生问题这一事实——这意味着什么?如果它有小故障,可能会导致这种行为。@Serge我认为verilog中使用的gates不会导致任何延迟,除非明确说明。那么,由于门控时钟,这个问题真的可能吗?PS:如果我错了,请原谅。我对verilog很陌生。如果时钟线包含小故障,它们不会显示在常规跟踪中。这些是模拟滴答声中的小故障。尽管如此,它们产生了翻牌可以反应的边缘。您可以添加
always@*$display($time,clk)
,查看时钟是否在您不期望的情况下发生变化。regClk可能还有其他驱动程序也会导致故障。很难判断提取的代码中发生了什么。
module reg_32bit(q,d,clk,reset);
    input [31:0] d;
    input clk,reset;
    output [31:0] q;
    genvar j;
    generate for(j=0;j<32;j=j+1)
                begin: reg_loop
                dff flipflop (q[j],d[j],clk,reset);
                end
    endgenerate
endmodule
module regf(clk,reset,ReadReg1, ReadReg2, WriteData, WriteReg, RegWrite, ReadData1, ReadData2);
    input clk,reset,RegWrite;
    input [1:0] ReadReg1, ReadReg2, WriteReg;
    input [31:0] WriteData;
    output [31:0] ReadData1, ReadData2;

    wire [3:0] decOut;
    wire [3:0] regClk;
    dec_2to4 dec1(decOut,WriteReg);

    wire [31:0] RegFileAcc[0:3];

    assign regClk[0]=(decOut[0] & RegWrite & clk);
    assign regClk[1]=(decOut[1] & RegWrite & clk);
    assign regClk[2]=(decOut[2] & RegWrite & clk);
    assign regClk[3]=(decOut[3] & RegWrite & clk);

    reg_32bit regs1 (RegFileAcc[0],WriteData,regClk[0],reset);
    reg_32bit regs2 (RegFileAcc[1],WriteData,regClk[1],reset);
    reg_32bit regs3 (RegFileAcc[2],WriteData,regClk[2],reset);
    reg_32bit regs4 (RegFileAcc[3],WriteData,regClk[3],reset);

    bit32_mux4to1 mux1(ReadData1,{RegFileAcc[3], RegFileAcc[2], RegFileAcc[1], RegFileAcc[0]}, ReadReg1);
    bit32_mux4to1 mux2(ReadData2,{RegFileAcc[3], RegFileAcc[2], RegFileAcc[1], RegFileAcc[0]}, ReadReg2);
endmodule