我正在尝试将一个总线等于一个结构的总线,用于结构数组(s.t.数组大小==总线大小)。我的结构看起来像
BFRAME_OUTPUT bframe_outs[`BSTACK_SIZE-1:0];
logic [`BSTACK_SIZE-1:0] valid;
我已经宣布了结构和总线数组
assign valid[`BSTACK_SIZE-1:0] = bframe_outs[`BSTACK_SIZE-1:0].valid;
//
// or
//
for(int i = 0; i < `BSTACK_SIZE; ++i) begin
assign[i] = bframe_outs[i].valid;
end
我想做一些像这样的事情来简单地使有效总线等于结构数组的有效位。
Error-[XMRE] Cross-module reference resolution error
/modules/branch_stack.sv, 87
Error found while trying to resolve cross-module reference.
token 'bframe_outs'. Originating module 'branch_stack'.
Source info: assign valid[(16 - 1):0] = bframe_outs[(16 - 1):0].valid;
但是在尝试使用vcs进行模拟时出现错误:
{{1}}
答案 0 :(得分:2)
更重要的是,还有一个您没有显示的错误:
错误 - [PSNA]部件选择不允许testbench.sv,14部件选择 不允许在类数组上。来源信息:分配有效[(5 - 1):0] = bframe_outs [(5 - 1):0] .valid; 将部分选择转换为 分别指每个元素。
如错误所示,您需要将分配转换为部件选择。在这里,您可以使用以下两种方法之一。将logic
用作reg
并在always
块中使用,或将logic
用作wire
并执行其他操作。
将其用作reg
时,需要在某些程序块中提取值。因此,只需删除assign
语句并使用alway_comb
即可。由于您在此处使用了logic
,因此无需更改其数据类型。
always_comb
begin
for(int i = 0; i < `BSTACK_SIZE; ++i)
valid[i] = bframe_outs[i].valid;
end
或者,有一个generate
块可以多次执行某些操作。请注意,通过使用generate
阻止,您可以提供连续分配并将logic
用作wire
。在这里,您需要单独向bit
提供每个wire
信号。在这里,使用generate
如下:
genvar i;
generate
for(i = 0; i < `BSTACK_SIZE; ++i) begin
assign valid[i] = bframe_outs[i].valid;
end
endgenerate
有关SystemVerilog IEEE 1800-2012的结构和此链接,请参阅generate blocks第7.2节。我在EDAPlayground链接创建了一个工作示例。