【问题标题】:SystemVerilog: Assignment pattern element <name>: Element widths don't match (error: vlog-7034)SystemVerilog:分配模式元素 <名称>:元素宽度不匹配(错误:vlog-7034)
【发布时间】:2016-11-30 17:07:00
【问题描述】:

我正在尝试(未成功)使用多维数组来发送硬编码的常量数组,这些常量数组可以被其他模块中的计数器索引。

我目前的策略是使用参数数组,它可以编译和部署,但在硬件上只考虑每个数组元素中的第一位。这反映在 RTL 视图中,所以我去 modelsim 并收到此错误:

Error: (vlog-7034) <path>(<line>): Array assignment to type 'reg[9:0] $[19:0]' from type 'reg $[19:0]':  Assignment pattern element 'NoMove':  Element widths (10, 1) don't match

我的代码在这里:

module EScheduler(input Clk, Reset,
                output reg [9:0] ESchedCtr,
                output reg [9:0] ESchedX [NE - 1:0][NM - 1:0], ESchedY [NE - 1:0][NM - 1:0],
                output reg [9:0] EShipInitialX [NE - 1:0], EShipInitialY [NE - 1:0],
                output reg ESchedFire [NE - 1:0][NM - 1:0]);
    logic clkby2;
    initial clkby2 = 0;
    always_ff @ (posedge Clk)
    begin
        clkby2 <= ~clkby2;
    end
    parameter PlusOne = 10'b1;
    parameter MinusOne = (~(PlusOne) + 10'b1);
    parameter reg NoMove [NM - 1:0] = '{10'd0, 10'd0, 10'd0, 10'd0, 10'd0,
                                        10'd0, 10'd0, 10'd0, 10'd0, 10'd0,
                                        10'd0, 10'd0, 10'd0, 10'd0, 10'd0,
                                        10'd0, 10'd0, 10'd0, 10'd0, 10'd0};
    parameter reg CircleX [NM - 1:0] = '{   PlusOne, PlusOne, PlusOne, PlusOne, PlusOne,
                                            MinusOne, MinusOne, MinusOne, MinusOne, MinusOne,
                                            MinusOne, MinusOne, MinusOne, MinusOne, MinusOne,
                                            PlusOne, PlusOne, PlusOne, PlusOne, PlusOne};
    parameter reg CircleY [NM - 1:0] = '{   PlusOne, PlusOne, PlusOne, PlusOne, PlusOne,
                                            PlusOne, PlusOne, PlusOne, PlusOne, PlusOne,
                                            MinusOne, MinusOne, MinusOne, MinusOne, MinusOne,
                                            MinusOne, MinusOne, MinusOne, MinusOne, MinusOne};
    parameter reg BackAndForth [NM - 1:0] = '{  PlusOne, MinusOne, PlusOne, MinusOne, PlusOne,
                                                MinusOne, PlusOne, MinusOne, PlusOne, MinusOne,
                                                PlusOne, MinusOne, PlusOne, MinusOne, PlusOne,
                                                MinusOne, PlusOne, MinusOne, PlusOne, MinusOne};
    parameter reg FireOnFrame13 [NM - 1:0] = '{1'b0, 1'b0, 1'b0, 1'b0, 1'b0,
                                    1'b0, 1'b0, 1'b0, 1'b0, 1'b0,
                                    1'b0, 1'b0, 1'b1, 1'b1, 1'b1,
                                    1'b0, 1'b0, 1'b0, 1'b0, 1'b0 };
    always_ff @ (posedge clkby2)
    begin
        if(Reset == 1'b1)
        begin
            ESchedCtr <= 10'b0;
        end
        else
        begin
            if(ESchedCtr >= NM - 1)
                ESchedCtr <= 10'b0;
            else
                ESchedCtr <= ESchedCtr + 10'b1;
        end
        ESchedFire <= '{ FireOnFrame13, FireOnFrame13,
                FireOnFrame13, FireOnFrame13,
                FireOnFrame13, FireOnFrame13,
                FireOnFrame13, FireOnFrame13,
                FireOnFrame13, FireOnFrame13 };
    end
    always_comb
    begin
        EShipInitialX = '{10'd020, 10'd080, 10'd140, 10'd200, 10'd260, 10'd320, 10'd380, 10'd440, 10'd500, 10'd560};
        EShipInitialY = '{10'd040, 10'd040, 10'd040, 10'd040, 10'd040, 10'd040, 10'd040, 10'd040, 10'd040, 10'd040};
        ESchedX = '{9: CircleX, 8: BackAndForth, 7: CircleY, 6: NoMove, 5: NoMove,
                    4: NoMove, 3: NoMove, 2: NoMove, 1: NoMove, 0: NoMove};
        ESchedY = '{CircleY, NoMove, CircleX, NoMove, NoMove,
                    NoMove, NoMove, NoMove, NoMove, NoMove};
    end
endmodule 

我开始使用此处提供的答案:https://verificationacademy.com/forums/systemverilog/working-multi-dimensional-associative-arrays

这是使用冒号来定义每个元素所在的索引,但这并不成功。 Google 搜索中没有其他提及此错误的信息。

【问题讨论】:

    标签: arrays fpga system-verilog hdl


    【解决方案1】:

    幸运的是,愚蠢的错误。我忘了在参数声明中包含字段宽度:

    parameter reg [9:0] CircleX [NM - 1:0] = '{   PlusOne, PlusOne, PlusOne, PlusOne, PlusOne,
                                            MinusOne, MinusOne, MinusOne, MinusOne, MinusOne,
                                            MinusOne, MinusOne, MinusOne, MinusOne, MinusOne,
                                            PlusOne, PlusOne, PlusOne, PlusOne, PlusOne};
    parameter reg [9:0] CircleY [NM - 1:0] = '{   PlusOne, PlusOne, PlusOne, PlusOne, PlusOne,
                                            PlusOne, PlusOne, PlusOne, PlusOne, PlusOne,
                                            MinusOne, MinusOne, MinusOne, MinusOne, MinusOne,
                                            MinusOne, MinusOne, MinusOne, MinusOne, MinusOne};
    parameter reg [9:0] BackAndForth [NM - 1:0] = '{  PlusOne, MinusOne, PlusOne, MinusOne, PlusOne,
                                                MinusOne, PlusOne, MinusOne, PlusOne, MinusOne,
                                                PlusOne, MinusOne, PlusOne, MinusOne, PlusOne,
                                                MinusOne, PlusOne, MinusOne, PlusOne, MinusOne};
    parameter reg FireOnFrame13 [NM - 1:0] = '{1'b0, 1'b0, 1'b0, 1'b0, 1'b0,
                                    1'b0, 1'b0, 1'b0, 1'b0, 1'b0,
                                    1'b0, 1'b0, 1'b1, 1'b1, 1'b1,
                                    1'b0, 1'b0, 1'b0, 1'b0, 1'b0 };
    

    我将保留此解决方案,以便其他人可以从搜索结果中看到此错误代码中受益。

    【讨论】:

    • 与您的问题无关,但使用位运算取反数字对于调试您的代码的其他人来说并不明显,并且可能会阻止综合工具执行优化。此外,PlusOneMinusOne 也不是那么可读。最好使用有符号值parameter signed [9:0] BackAndForth [NM - 1:0] = { 1, -1, 1, ...
    • 谢谢。我有点新手,我的课程讲师使用二进制补码来否定数字,所以我照做了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    相关资源
    最近更新 更多