несколько проблем с типом данных tri в SystemVerilog

В последнее время я только начал использовать тип данных «три». И я применил этот тип данных в двух разных модулях. Он прекрасно обслуживает первый модуль с точки зрения логического и структурного моделирования (до синтеза), где в основном у меня есть связка логических проводов, назначенных одному и тому же тройнику, например:

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. Это заставляет меня объединить их в одну сеть, чтобы было легче сделать это как вывод модуля.

Любые мысли приветствуются. Я очень ценю вашу помощь здесь.

Тайхай


person Tidus    schedule 26.06.2015    source источник


Ответы (1)


Вам не разрешено выполнять процедурные назначения для проводов. Чтобы установить соединение, вам необходимо использовать непрерывное назначение, как вы делали в 1-м модуле. Для этого , вам нужен цикл генерации для .. Примерно так:

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       

Я предоставлю вам разобраться с выражением лица, это не должно быть слишком сложно ...

person dave_59    schedule 26.06.2015
comment
Спасибо, Дэйв. Это работает как шарм. Но у меня есть еще два комментария: 1) Я думаю, что на самом деле блокирующее процедурное назначение можно использовать для соединения проводов. См. раздел 10.4 в стандарте IEEE для SystemVerilog. 2) Первоначально я использовал generate struct для выполнения всей проводки, но затем то, как я думал о выражении var_cnt, не имело смысла для ModelSim, поэтому я решил объявить его как целое число и, надеюсь, допускает некоторую гибкость выражение внутри always_comb, что оно и делает. Но тогда ModelSim, похоже, не любит, когда упоминается triArrWire, потому что это tri тип, а не логика. - person Tidus; 29.06.2015
comment
Нет. Процедурные назначения, блокирование или неблокирование не могут быть выполнены для проводов. Раздел 10.4 относится только к переменным, а не к проводам. См. (go.mentor.com/wire-vs-reg). - person dave_59; 29.06.2015
comment
Спасибо, Дэйв. Я ценю это. - person Tidus; 02.07.2015