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
表情就交给你了,应该不会太难...
我最近才开始使用 '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
表情就交给你了,应该不会太难...