System verilog &引用;“非法引用网络”;systemverilog中出错-尝试设计简单仲裁器

System verilog &引用;“非法引用网络”;systemverilog中出错-尝试设计简单仲裁器,system-verilog,System Verilog,下面是我为simpleArbiter 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; paramet

下面是我为simpleArbiter

        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
模块仲裁器(时钟、rst、请求、grnt、请求值);
输入时钟;
输入rst;
输入[3:0]请求;
输入[3:0]请求值;
输出[3:0]grnt;
int j;
int i;
参数A=2'd0;
参数B=2'd1;
参数C=2'd2;
参数D=2'd3;
逻辑[1:0]当前_状态;
逻辑[1:0]下一个_状态;
总是用梳子
开始
案例(当前状态)
D:
开始
grnt=4'b1000;
j=0;

对于(i=0;i,您的代码有两个问题

  • 您已经在代码中使用了两次
    endmodule
    语句。只需在第86行注释掉一条即可

  • 您没有为
    grnt
    变量定义数据类型,因此默认情况下它是
    wire
    ,并且
    wire
    不能在always块中使用,因此将其声明为
    reg
    /
    逻辑


  • 您的代码有两个问题

  • 您已经在代码中使用了两次
    endmodule
    语句。只需在第86行注释掉一条即可

  • 您没有为
    grnt
    变量定义数据类型,因此默认情况下它是
    wire
    ,并且
    wire
    不能在always块中使用,因此将其声明为
    reg
    /
    逻辑


  • thnx很多,它已编译,但功能不好-它没有改变状态-你能看到问题所在吗?初始当前状态值是多少?重置时它的值是多少?这可能会发生,因为你的设计中没有重置逻辑。thnx很多,它已编译,但它功能不好-它没有改变状态-你能看到问题?初始当前状态值是多少?重置时的值是多少?这可能会发生,因为您的设计中没有重置逻辑。