systemverilog 中的“非法引用网络”错误 - 试图设计简单的仲裁者



这是我为简单仲裁者准备的代码

        module arbiter(clk,rst,req,grnt,req_val);
    input clk;
    input rst;
    input [3:0] req;
    input [3:0] req_val;
    output [3:0] grnt;
    int j;
    int i;
    parameter A = 2'd0;
    parameter B = 2'd1;
    parameter C = 2'd2;
    parameter D = 2'd3;
    logic [1:0] current_state; 
    logic [1:0] next_state;
    always_comb
    begin
    case (current_state)
        D:
        begin
            grnt = 4'b1000; 
            j = 0;
            for (i = 0; i<4;i++) begin
                if (req[(j+i) % 4 ] == 1) 
                    break;
            end
            case (i)
                0: next_state = A;
                1: next_state = B;
                2: next_state = C;
                3: next_state = D;
            endcase
        end
        A:
        begin
            j = 1;
            grnt = 4'b001; 
            for (i = 0; i<4;i++) begin
                if (req[(i+j) % 4] == 1) 
                    break;
            end
            case (i)
                0: next_state = A;
                1: next_state = B;
                2: next_state = C;
                3: next_state = D;
            endcase
        end
        B:
        begin
            j = 2;
            grnt = 4'b0010; 
            for (i = 0; i<4;i++ ) begin
                if (req[(i+j) % 4] == 1) 
                    break;
            end
            case (i)
                0: next_state = A;
                1: next_state = B;
                2: next_state = C;
                3: next_state = D;
            endcase
        end
        C:
        begin
            j = 3;
            grnt = 4'b0100; 
            for (i = 0; i<4;i++ ) begin
                if (req[(i+j)% 4] == 1) 
                    break;
            end
            case (i)
                0: next_state = A;
                1: next_state = B;
                2: next_state = C;
                3: next_state = D;
            endcase
        end
    endcase
    end
    endmodule

    always_ff@(posedge clk)
    begin
    current_state <= next_state;
    end
endmodule

我收到以下错误:

arbitrer.sv(21):(vlog-2110)非法引用网络"grnt"。

arbitrer.sv(87):接近"always_ff":语法错误、意外always_ff、预期类。

那么grnt有什么问题呢?我不能直接分配给模块输出?

你的代码有两个问题。

  1. 您在代码中使用了两次endmodule语句。只需在第 86 行注释掉一个即可。

  2. 您尚未为grnt变量定义数据类型,因此默认情况下它是一个wire,并且wire不能在 always block 中使用,因此请将其声明为 reg/logic

最新更新