阻塞和非阻塞分配错误的混合

Mix of blocking and non-blocking assignments error

我在有关阻塞和非阻塞分配的代码中遇到此错误。我最初在初始化时完成了一些阻塞分配,但将它们移到了 initial 部分。我仍然遇到这个问题,不知道还有什么要改变的。任何解决它的帮助将不胜感激。

这是我第一次在个人项目中使用 Verilog,所以如果您看到任何初学者错误,我很乐意学习。

错误:

第 89 行:混合对变量的阻塞和非阻塞赋值不是推荐的编码做法。

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    13:21:27 09/10/2021 
// Design Name: 
// Module Name:    avg_small 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////

module mux8(
    data0,
    data1,
    data2,
    data3,
     data4,
     data5,
     data6,
     data7,
    select,
    data_output
);

  parameter WIDTH = 8;

  input [WIDTH-1:0] data0;
  input [WIDTH-1:0] data1;
  input [WIDTH-1:0] data2;
  input [WIDTH-1:0] data3;
  input [WIDTH-1:0] data4;
  input [WIDTH-1:0] data5;
  input [WIDTH-1:0] data6;
  input [WIDTH-1:0] data7;
  input [2:0] select;
  output [WIDTH-1:0] data_output;

reg [WIDTH-1:0] data_bus ;
  always @ (*) begin
    case (select)
      0: data_bus <= data0 ;
      1: data_bus <= data1 ;
      2: data_bus <= data2 ;
      3: data_bus <= data3 ;
        4: data_bus <= data4 ;
        5: data_bus <= data5 ;
        6: data_bus <= data6 ;
        7: data_bus <= data7 ;
    endcase
  end
  assign data_output = data_bus ;
endmodule


module add_8_10_10(ctrl,a,b,out);
    input [2:0] ctrl;
    input [7:0] a;
    input [10:0] b;
    output [10:0] out;
    
    reg [10:0] out_hold; // can this just be out as a reg/ can out be a reg?
    
    always @(ctrl) begin
        out_hold <= a+b;
        end
        assign out = out_hold;
        
endmodule


module avg_small(
    input clk,
    input rs,
    output [7:0] ave8,
    input  [7:0] num_in
    );
     
     reg [7:0] registers [7:0] ;
     reg [2:0] state;
     reg [2:0] next_state;
     reg [10:0] temp_sum;
     reg [7:0] output_register;
     
     wire [7:0] a;
     wire [10:0] b;
     wire [10:0] c;
     wire [10:0] add_wire;
     
     mux8 muxy(    
     .data0(registers[0]),
    .data1(registers[1]),
    .data2(registers[2]),
    .data3(registers[3]),
     .data4(registers[4]),
     .data5(registers[5]),
     .data6(registers[6]),
     .data7(num_in),
    .select(state),
    .data_output(a)
);
     
     add_8_10_10 add(
        .ctrl(state),
       .a(a),
        .b(temp_sum),
        .out(add_wire)
     );
     
     
     initial begin
         next_state <= 3'd0;
         temp_sum <= 11'd0;
         output_register <= 7'd0;
     
         registers[0] <= 0;
         registers[1] <= 0;
         registers[2] <= 0;
         registers[3] <= 0;
         registers[4] <= 0;
         registers[5] <= 0;
         registers[6] <= 0;
         registers[7] <= 0;
         state=0;
     end
     
     
     
     always@(posedge clk) begin
        if(rs) begin
                state <= 0;
                //TODO -- clear registers
        end else begin
     
            case(state)
            0:begin
                registers[0] <= registers[1];
                state = #50 1;
            end
            1:begin
                registers[1] <= registers[2];
                #50;
                state <= 2;
            end
            2:begin
                registers[2] <= registers[3];
                #50;
                state = 3;
            end
            3:begin
                registers[3] <= registers[4];
                #50;
                state = 4;
            end
            4:begin
                registers[4] <= registers[5];
                #50;
                state = 5;
            end
            5:begin
                registers[5] <= registers[6];
                #50;
                state = 6;
            end
            6:begin
                registers[6] <= registers[7];   
                #50;
                state = 7;
            end
            7:begin
                registers[7] <= num_in;
                output_register <= add_wire;
                #50;
                state = 0;
            end
         
         endcase
         end
     end
     assign ave8 = output_register;
     
endmodule
     

这是第 89 行:

 reg [2:0] state;

该消息告诉您您正在对 state 信号进行两种类型的分配。

第 140 行是 非阻塞 赋值,因为它使用 <=:

            state <= 0;

第 147 行是一个 阻塞 赋值,因为它使用 =:

            state = #50 1;

推荐的编码做法是二选一。在这种情况下,由于 state 是在顺序逻辑 always 块内分配的,因此您应该对 all 分配使用非阻塞 state。它是顺序的,因为它对时钟信号的边沿敏感:

 always@(posedge clk) begin

您也应避免向 state 添加延迟。所以,这一行应该从:

            state = #50 1;

至:

            state <= 1;

您应该从 initial 块中删除对 state 的分配。推荐的编码做法是在单个块内对信号进行所有分配。

所有这些建议也适用于您的其他 reg 信号,例如 registers。最好将它们保留在 always 块中,这听起来就像您最初所做的那样。


对于其余代码,您应该使用分块赋值,因为您没有其他顺序 always 块。

为了将来对您的代码进行严格审查,您可以 post 在 Code Review。但是,您的代码必须是有效且没有错误消息的代码。