SystemVerilog 中关于 'tri' 数据类型的几个问题

a few issues about 'tri' data type in SystemVerilog

我最近才开始使用 'tri' 数据类型。我在两个不同的模块中应用了这个数据类型。它在逻辑和结构模拟(综合之前)方面很好地服务于第一个模块,基本上我有一堆逻辑线分配给同一个三,像这样:

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

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

在 SystemVerilog 的 IEEE 标准中,它说

A wire net can be used for nets that are driven by a single gate or continuous assignment. The tri net type can be used where multiple drivers drive a net. Logical conflicts from multiple sources of the same strength on a wire or a tri net result in x (unknown) values.

所以我假设它像上面的代码一样工作。但是,当我将相同的逻辑应用于我的第二个模块时,

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) Illegal reference to net "triArrWire".

基本上第二个模块所做的就是简单地模仿第一个模块,但是在 always_comb 块中。但为什么它没有通过 ModelSim 编译检查呢?我在这里遗漏了什么吗?

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

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

太海

您不能对电线进行程序分配。要建立连接,您需要使用连续分配作为你在第一个模块中做了。为此,你需要一个 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       

表情就交给你了,应该不会太难...