为什么值更改为1时,我的Verilog波形突然停止

问题描述 投票:0回答:1

我正在创建带有危险单元的流水线处理器。在仿真期间,当“冲洗” = 1时,程序波形将停止。我相信我的代码中存在某种无限循环,并且此危险单元不返回任何值。在图像中,我附加了您可以在值列中看到Flush变为1。但是在模块中,它的调用仍然为零,因此它很可能在此时循环。

Image of Waveform

`timescale 1ns / 1ps

module Hazard_Unit(input BranchD, MtoRFSelE, MtoRFSelM, RFWEE, RFWEM, RFWEW, RST, input [4:0] RsD, RtD, RsE, RtE, RFAE, RFAM, RFAW,
                   output reg Stall, ForwardAD, ForwardBD, Flush, output reg [1:0] ForwardAE, ForwardBE);

reg LWStall, BRStall;

always @(*) begin
    if (RST) begin
        ForwardAD = 1'b0;
        ForwardBD = 1'b0;
        ForwardAE = 2'b00;
        ForwardBE = 2'b00;
        LWStall = 1'b0;
        BRStall = 1'b0;
        Stall = 1'b0;
        Flush = 1'b0;
    end

    else begin
        if ((RsE != 0) && RFWEM && (RsE == RFAM)) ForwardAE = 2'b10;
        else if ((RsE != 0) && RFWEW && (RsE == RFAW)) ForwardAE = 2'b01;
        else ForwardAE = 2'b00;

        if ((RtE != 0) && RFWEM && (RtE == RFAM)) ForwardBE = 2'b10;
        else if ((RtE != 0) && RFWEW && (RtE == RFAW)) ForwardBE = 2'b01;
        else ForwardBE = 2'b00;

        if (MtoRFSelE && ((RtE == RsD) || (RtE == RtD))) LWStall = 1'b1;
        else LWStall = 1'b0;

        if ((RsD != 0) && (RsD == RFAM) && RFWEM) ForwardAD = 1'b1;
        else ForwardAD = 1'b0;

        if ((RtD != 0) && (RtD == RFAM) && RFWEM) ForwardBD = 1'b1;
        else ForwardBD = 1'b0;

        if ((RsD == RFAE || RtD == RFAE) && BranchD && RFWEE || (RsD == RFAM || RtD == RFAM) && BranchD && MtoRFSelM) BRStall = 1'b1;
        else BRStall = 1'b0;

        if (LWStall || BRStall) begin
            Flush = 1'b1;
            Stall = 1'b0;
        end
        else begin
            Flush = 1'b0;
            Stall = 1'b1;
        end
    end
end
endmodule
verilog infinite-loop pipeline microprocessors
1个回答
0
投票

实际上,您可能有组合循环。

我可以搜索它的位置,但我更愿意为您提供解决这些问题的一般方法。如果发生在我身上,我将使用它(一次在蓝色的月亮中:-)

  1. 请确保使用足够长的时钟。例如100或500个时间单位。通常,这是一个好习惯。 1高​​和1低的时钟时间正在制造中。因此,您的模拟运行不会变慢]
  2. 在语句之间放置#5

    if ((RsE != 0) && RFWEM && (RsE == RFAM)) ForwardAE = 2'b10;
    else if ((RsE != 0) && RFWEW && (RsE == RFAW)) ForwardAE = 2'b01;
    else ForwardAE = 2'b00;
    #5;
    
    if ((RtE != 0) && RFWEM && (RtE == RFAM)) ForwardBE = 2'b10;
    else if ((RtE != 0) && RFWEW && (RtE == RFAW)) ForwardBE = 2'b01;
    else ForwardBE = 2'b00;
    #5;
    ...
    

现在,您的波形很可能会继续运行,并向您显示振荡的位置。修复代码后,不要忘记再次删除#5。

下一点:您的代码通常是错误的。您在该if语句中产生了许多闩锁。必须在每个ForwardAD, ForwardBD, ForwardAE ...语句中为每个变量if分配一个值。或者,您应该在else之后立即给它们提供默认值:

else begin
    ForwardAD = ..;
    ForwardBD = ..;
    ForwardAE = .;
    ...
    if ((RsE != 0) &....

如果您无法执行此操作,则整个部分可能应该是带有时标的语句:

always @(posedge some_clock) begin
© www.soinside.com 2019 - 2024. All rights reserved.