System verilog 如何在system verliog中切片阵列接口
我尝试通过always_comb过程使用数组接口映射,而不是生成语句 您可以在下面()中看到我的测试代码System verilog 如何在system verliog中切片阵列接口,system-verilog,System Verilog,我尝试通过always_comb过程使用数组接口映射,而不是生成语句 您可以在下面()中看到我的测试代码 接口tintf; 位有效; 位数据; 钻头失速; endinterface:tintf 模块顶部; tintf intf_a[0:3](); 位有效,数据暂停; 总是从梳子开始 循环\u用于\u映射: 对于(int i=0;i
接口tintf;
位有效;
位数据;
钻头失速;
endinterface:tintf
模块顶部;
tintf intf_a[0:3]();
位有效,数据暂停;
总是从梳子开始
循环\u用于\u映射:
对于(int i=0;i<4;i++)开始
intf_a[i].valid=valid;
intf_a[i].数据=数据;
结束
结束
端模
但我看到下面的错误消息
intf_a[i].valid=valid;
|ncelab:*E,NOTPAR(./testbench.sv,18 | 13):常量表达式[4(IEEE)]的非法操作数
我不知道这就是为什么非法…因为我知道for循环中的“I”被认为是常量
你能告诉我我遗漏了什么吗?对于合成来说,for循环被展开为一组常量迭代,这可能是真的,但从语言的角度来看,它不是常量。模拟工具不知道您计划合成代码的哪些部分。您需要将其编写为
生成for
循环
for(genvar i = 0; i < 4; i++) begin : loop_for_mapping
always_comb begin
intf_a[i].valid = valid;
intf_a[i].data = data;
end
end
for(genvar i=0;i<4;i++)begin:loop\u for\u映射
总是从梳子开始
intf_a[i].valid=valid;
intf_a[i].数据=数据;
结束
结束
将接口(或模块)实例化为数组(阵列实例)是verilog的生成
功能的一部分。因此,您只能通过使用文字常量(0,1,2…)或从其他生成块(请参见dave_59的答案)访问这些常量
如果改为使用接口变量数组,则会更加灵活:
interface tintf;
bit [3:0] valid;
bit [3:0] data;
bit [3:0] stall;
endinterface: tintf
module top;
tintf intf_a();
bit valid, data, stall;
always_comb begin
loop_for_mapping:
for(int i = 0; i < 4; i++) begin
intf_a.valid[i] = valid;
intf_a.data[i]= data;
end
end
endmodule
接口tintf;
位[3:0]有效;
位[3:0]数据;
位[3:0]暂停;
endinterface:tintf
模块顶部;
tintf intf_a();
位有效,数据暂停;
总是从梳子开始
循环\u用于\u映射:
对于(int i=0;i<4;i++)开始
intf_a.valid[i]=有效;
intf_a.data[i]=数据;
结束
结束
端模
您的意思是,在这种情况下,无法避免使用“generate for…”。。。。谢谢^^正确。实例数组不是真正的数组,必须特别处理。真正的数据数组只需要一个内存偏移量就可以索引到每个元素中。
interface tintf;
bit [3:0] valid;
bit [3:0] data;
bit [3:0] stall;
endinterface: tintf
module top;
tintf intf_a();
bit valid, data, stall;
always_comb begin
loop_for_mapping:
for(int i = 0; i < 4; i++) begin
intf_a.valid[i] = valid;
intf_a.data[i]= data;
end
end
endmodule