【问题标题】:Verilog if statement inconsistencyVerilog if 语句不一致
【发布时间】:2021-04-10 12:05:54
【问题描述】:

我正在尝试使用 push/pop 信号编写一个深度为 8 的简单 4 位堆栈,但它的行为方式非常奇怪。我的一个 if 语句运行良好,而另一个则根本不运行。这是我的代码:

module Stack_8x4(
    input wire clk,
    input wire reset,
    input wire push,
    input wire pop,
    input wire [3:0] data_in,
    output reg [3:0] data_out,
    output reg empty,
    output reg full
    );
    
    reg [3:0] index;
    reg [3:0] stack [7:0];
    
    always @(posedge reset) begin
        index <= -1;
        data_out = 4'd0;
        empty = 1;
        full = 0;
    end
    always @(posedge clk) begin
        if (push & !pop) begin
            empty = 0;
            if(!full) begin
                index = index + 1;
                stack[index] = data_in;
                if(index > 6) full = 1;
            end
        end
        if (pop & !push) begin
            full = 0;
            if(!empty) begin
                data_out = stack[index];
                index = index - 1;
                if(index < 0) empty= 1;
            end else data_out = 0;
        end
    end
endmodule

如您所见,push 和 pop 的逻辑几乎相同。我的问题是为什么if(index &lt; 0) empty= 1; 行不工作而if(index &gt; 6) full = 1; 工作正常?

这里有一个测试台和模拟以了解更多详细信息:

module sim();

reg clk;
reg reset;
reg push;
reg pop;
reg [3:0] data_in;
wire [3:0] data_out;
wire full;
wire empty;
//wire [3:0]i;

always begin
clk = 0;
#5
clk = 1;
#5
clk = 0;
end

initial begin
// setup
reset = 1;
push = 0;
pop = 0;
data_in = 0;
#10
reset = 0;

// idle
#20

// push 1, 2, 3, 4, 5, 6, 7, 8, 9 to fill the module and test for idling at full
push = 1;
data_in = 1;
#10
data_in = 2;
#10
data_in = 3;
#10
data_in = 4;
#10
data_in = 5;
#10
data_in = 6;
#10
data_in = 7;
#10
data_in = 8;
#10
data_in = 9;
#10
data_in = 10;
#10
data_in = 11;
#10
pop = 1;
#10
push = 0;
#30
pop = 0;
push = 1;
#30
push = 0;
#20
pop = 1;
// pop
//pop = 1;

end

Stack_8x4 S (
    .clk(clk),
    .push(push),
    .pop(pop),
    .reset(reset),
    .data_in(data_in),
    .data_out(data_out),
    .full(full),
    .empty(empty)
);

endmodule

【问题讨论】:

    标签: verilog hdl vivado


    【解决方案1】:

    您的主要问题是尝试将有符号数据与无符号变量一起使用。所以, index &lt;= -1;index &lt; 0 只是不能按预期工作。我的建议是忘记带符号的算术,只做无符号的。

    其他问题:

    1. 您应该只使用一个 always 块来执行重置和非重置工作。
    2. 你应该在你的 always @posedge 块中到处使用非阻塞赋值
    3. 由于“索引

    所以,这是我对您的代码的重写:

       always @(posedge clk) begin
          if (reset) begin
             index <= 0;
             data_out <= 4'd0;
             empty <= 1;
             full <= 0;
          end      
          else if (push & !pop) begin
              if(index < 8) begin
                full<= 0;
                stack[index] <= data_in;
                index <= index + 1;
             end
             else 
               full <= 1;
          end
          else if (pop & !push) begin
             if(index == 0) begin
                empty <= 1;
                data_out <= 0;
             end
             else begin
                empty <= 0;
                index <= index - 1;
                data_out <= stack[index];
             end
          end // if (pop & !push)
       end // always @ (posedge clk)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 2020-12-24
      相关资源
      最近更新 更多