В последнее время я только начал использовать тип данных «три». И я применил этот тип данных в двух разных модулях. Он прекрасно обслуживает первый модуль с точки зрения логического и структурного моделирования (до синтеза), где в основном у меня есть связка логических проводов, назначенных одному и тому же тройнику, например:
logic wire1;
logic wire2;
logic wire3;
tri tri1;
assign tri1 = wire1;
assign tri1 = wire2;
assign tri1 = wire3;
В стандарте IEEE для SystemVerilog говорится:
Проволочная сеть может использоваться для сетей, которые управляются одним затвором или непрерывным назначением. Тип три сети может использоваться там, где несколько драйверов управляют сетью. Логические конфликты из нескольких источников одинаковой силы на проводе или в тройной цепи приводят к значениям 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".
По сути, второй модуль просто имитирует 1-й модуль, но в блоке always_comb. Но почему он не проходит проверку компиляции ModelSim? Я что-то упустил?
С другой стороны, обычно ли подключать разные провода к одному проводу? Причина, по которой я это делаю, состоит в том, что большинство проводов будут иметь высокий импеданс «z», и только один из них будет иметь 0 или 1 и будет управлять сетью TriNet. Это заставляет меня объединить их в одну сеть, чтобы было легче сделать это как вывод модуля.
Любые мысли приветствуются. Я очень ценю вашу помощь здесь.
Тайхай