System verilog 如何在system verliog中切片阵列接口

System verilog 如何在system verliog中切片阵列接口,system-verilog,System Verilog,我尝试通过always_comb过程使用数组接口映射,而不是生成语句 您可以在下面()中看到我的测试代码 接口tintf; 位有效; 位数据; 钻头失速; endinterface:tintf 模块顶部; tintf intf_a[0:3](); 位有效,数据暂停; 总是从梳子开始 循环\u用于\u映射: 对于(int i=0;i

我尝试通过always_comb过程使用数组接口映射,而不是生成语句

您可以在下面()中看到我的测试代码

接口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