关于SystemVerilog中'tri'数据类型的一些问题

时间:2015-06-26 17:07:35

标签: types simulation system-verilog modelsim

这些天我刚刚开始使用'tri'数据类型。我已经在两个不同的模块中应用了这种数据类型。它在逻辑和结构仿真(合成之前)方面很好地服务于第一个模块,其中基本上我有一堆逻辑线分配给同一个tri,如下所示:

logic wire1;
logic wire2;
logic wire3;
tri tri1;

assign tri1 = wire1;
assign tri1 = wire2;
assign tri1 = wire3;

在IEEE Standard for SystemVerilog中,它说

  

有线网可用于由单门或连续分配驱动的网。在多个驱动程序驱动网络的情况下,可以使用 tri 网络类型。来自线路上相同强度的多个源或网络的逻辑冲突会导致x(未知)值。

所以我认为它的工作方式与上面的代码类似。但是,当我将相同的逻辑应用于我的第二个模块时,

integer var_a, var_b, var_c, var_cnt;
logic arrWire1[1:0][3:0];
logic arrWire2[1:0][1:0];
logic arrWire3[1:0];
tri triArrWire[7:0];

always_comb begin
  var_cnt = 7;
  for (var_a=1; var_a<=0; var_a--) begin
    for (var_b=1; var_b<=0; var_b--) begin
      for (var_c=(1+var_b*2); var_c<=var_b*2; var_c--) begin
        triArrWire[var_cnt] = arrWire1[var_a][var_c];
        triArrWire[var_cnt] = arrWire2[var_a][var_b];
        triArrWire[var_cnt] = arrWire3[var_a];
        var_cnt --;
      end
    end
  end
end

ModelSim对此的抱怨:

  

(vlog-2110)非法引用网“triArrWire”。

基本上,第二个模块的作用是简单地模仿第一个模块,但是在always_comb块中。但为什么它不通过ModelSim编译检查?我在这里错过了什么吗?

另一方面,通常是将不同的电线连接到一根电线上吗?我这样做的原因是因为大多数导线将处于高阻抗'z',并且其中只有一个将具有0或1并驱动三网。这使我想将它们合并到一个三网中,这样就可以更容易地将它作为模块的输出。

欢迎任何想法。我非常感谢你的帮助。

泰海

1 个答案:

答案 0 :(得分:2)

您不能对电线进行程序分配。要建立连接,您需要像在第一个模块中那样使用连续分配。要做到这一点,你需要一个generate-for循环..像:

for (genvar var_a=1; var_a<=0; var_a--) begin
  for (genvar var_b=1; var_b<=0; var_b--) begin
     for (genvar var_c=(1+var_b*2); var_c<=var_b*2; var_c--) begin
        parameter var_cnt = (some expression of var_a and var_b); 
        assign triArrWire[var_cnt] = arrWire1[var_a][var_c];
        assign triArrWire[var_cnt] = arrWire2[var_a][var_b];
        assing triArrWire[var_cnt] = arrWire3[var_a];
     end
  end
end       

我会留给你找出表达方式,这应该不会太难......