【问题标题】:In verilog Part-select of vector reg array is illegal在verilog中,向量reg数组的部分选择是非法的
【发布时间】:2016-02-24 17:39:09
【问题描述】:
reg [data_width-1:0]coeff[0:order-1];
wire[3:0]lsbcoeff;
wire [7:4]msbcoeff;

 lsbcoeff = coeff[3:0];
 msbcoeff = coeff[7:4];

在上面的代码行中,我得到了错误

向量 reg 数组 'coeff' 的部分选择是非法的

阻止分配的非法右手边

请指导我,如何克服这个? 赛灵思 v14.2 Verilog编码

【问题讨论】:

  • data_width = 8, order= 4;.......... 没有,我没用过,但是用的时候会报同样的错误
  • 您没有分配“订单”索引。 coeff[3:0]; 应该是 coeff[0][3:0]; 或带有变量索引 coeff[var_index][3:0];coeff[7:4] 的问题相同
  • initial begin for(i = 0; i < order ; i = i+1) lsbcoeff = coeff[i][3:0]; msbcoeff = coeff[i][7:4]; end 声明上述语句后,其显示错误如下对向量线'lsbcoeff'的引用不是合法的reg或变量左值,阻塞分配的左侧非法
  • @Suguresh Kumar Arali 您的新错误消息告诉您无法从初始块驱动电线。如果您想从初始块分配给lsbcoeffmsbcoeff,它们需要是regs。

标签: arrays filter signal-processing verilog xilinx


【解决方案1】:

您已将 coeff 定义为系数向量,我不确定您期望 coeff[3:0] 返回什么? LSBS 的向量?我认为您的意图类似于 coeff[0][3:0] 选择第一个向量的 LSB。下面的代码显示了一种可能的方法:

module tb;

    localparam data_width = 8;
    localparam order      = 2;

    reg  [data_width-1:0]coeff[0:order-1];
    reg [3:0] lsbcoeff;
    reg [7:4] msbcoeff;
    reg [7:0] this_coeff;

    always @* begin
      lsbcoeff   = coeff[0][3:0];
      msbcoeff   = coeff[0][7:4];
    end

endmodule

现在我已经阅读了 cmets,我看到这是 @Greg 已经提出的建议。

【讨论】:

  • 1个疑问,在主模块中我们可以使用localparam吗?
  • 为什么不使用 localparam?您不能将它们作为参数传递,但我只是在创建一个编译示例。
  • 哦好的..谢谢:)
【解决方案2】:

除@Morgan 代码外,还应使用verilog 中的assign 语句为电线赋值。

always @(*) begin
  assign    lsbcoeff   = coeff[0][3:0];
  assign    msbcoeff   = coeff[0][7:4];
end

【讨论】:

  • assign 用于wire,当不使用始终阻止时。我偷偷改成了 reg 类型,用于always
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多