【发布时间】:2015-11-07 07:50:44
【问题描述】:
我在使用 VCS 合成器的 System Verilog 中收到以下错误:
以下访问的索引数无效。 总线[i]
我基本上是在尝试做一个由接口组成的可参数化多路复用器,选择总线是单热的:
module myMux
#(int unsigned WIDTH=3)
(
my_interface bus[WIDTH-1:0],
input logic [WIDTH-1:0] select,
output logic [31:0] out_data
)
always_comb begin
out_data = 'x;
for (int unsigned i=0; i < WIDTH; i++) begin
if (select[i]) out_data = bus[i].in_data;
end
end
endmodule
我尝试了this answer here 中列出的不同方法(包括使用 |= ),但我总是遇到同样的错误。使用“genvar i”而不是 int 甚至无法编译。
如果我用 bus[0] 替换 bus[i],那么它会编译(但这不是我想要的)。 . .此外,用 for 语句中的数字(即 i
有什么想法吗?代码需要是可综合的。
【问题讨论】:
-
另一件事。 . .如果我将接口更改为注册信号而不是它的工作原理(但这不是我想要的)。
-
您的总线是声明为 [WIDTH-1:0] 还是应该是
bus[WIDTH]。此外,从代码中选择行似乎是单个位,应该是input select [WIDTH]。 genvar 解决方案必须有效,您可能犯了一些愚蠢的错误。 -
@shavill111 哦,当我将它复制到问题中时,这是一个错字。 Select 声明为 [WIDTH-1:0] 而 out_data 是 32 位总线。已在上述问题中更正。
-
我尝试用最新版本的 VCS 编译,但这些行仍然出错,但这次是“bus[i].in_data。类型检查失败的原因:只有常量索引是这里支持。”还是不知道怎么做一个简单的带接口的MUX,不敢相信做不到。
-
当我们没有为端口声明指定任何数据类型时,信号将默认为有线类型。所以,我们需要一个连续赋值语句......但是在第二种情况下,我们将数据类型指定为逻辑......所以连续赋值在那里不起作用......我们应该使用过程赋值。请在同一链接查看修改后的代码:edaplayground.com/x/LJ8
标签: system-verilog