Многоуправляемые сети: синтез в порядке, симуляция не удалась

У меня есть фундаментальная проблема с пониманием System Verilog. Я работаю над дизайном процессора, в котором некоторые системы шин должны быть разделены между несколькими процессорами (модули System Verilog). С арбитром одновременно должен быть активен только один модуль, управляющий шиной, в то время как все остальные являются высокоимпедансными.

Я избавился от предупреждений о многоуправляемых сетях в Vivado во время синтеза, и больше нет конфликтов шин, но симулятор выдает предупреждение, что сигналы шины «могут» быть многоуправляемыми. Я сделал крошечный пример кода, и я ожидал получить для «данных» «11», когда «выбрать» равно «10»?

В то время как в Vivado симуляция вообще останавливается, она работает с симулятором Cadence, но с неправильными результатами - моделирование снимка экрана< /а>

testbench.sv

`timescale 1ns / 1ps
module testbench_top();

logic [1:0] select;
logic [1:0] data;

top top_inst(.*);

initial
begin
  select = 0;
  #2 select = 1;
  #2 select = 2;
  #2 select = 0;;
end
  initial
    begin
      $monitor("t=%3d s=%b,d=%b\n",$time,select,data);
    end
endmodule

дизайн.sv

`timescale 1ns / 1ps
module top
(
 input logic [1:0] select,
 output logic [1:0] data 
);

driver_1 driver_1_inst(.*);
driver_2 driver_2_inst(.*);

endmodule



module driver_1
(
 input logic [1:0] select,
 output logic [1:0] data 
);
always_comb
begin
  if (select == 2'b10)
        data = 2'b11;
    else
        data = 'z;
end
endmodule



module driver_2
(
 input logic [1:0] select,
 output logic [1:0] data 
);
always_comb
begin
  if (select == 2'b01)
        data = 2'b01;
    else
        data = 'z;
end
endmodule

person ES_major    schedule 21.08.2018    source источник


Ответы (1)


Я предполагаю, что вы ожидаете, что значение data сигнализирует модулю top, который управляется двумя выходами ваших модулей драйверов (например, когда один диск 'z получает шину.

Это произойдет, если вы объявите сигнал top.data как output wire logic [1:0] data.

Раздел 23.2.2.3 Правила определения типа порта, типа данных и направления стандарта IEEE 1800-2012 гласит, что

Для выходных портов тип порта по умолчанию зависит от того, как указан тип данных: — Если тип данных опущен или объявлен с синтаксисом implicit_data_type, тип порта по умолчанию должен быть сетью типа сети по умолчанию. — Если тип данных объявлен с явным синтаксисом data_type, тип порта по умолчанию должен быть переменным.

В вашем случае применяется второе предложение, поскольку вы объявили data как output logic[1:0], что означает, что оно интерпретировалось как переменная, а не сеть. Множественные значения переменных не разрешаются (и в некоторых инструментах также недопустимы).

person Tudor Timi    schedule 21.08.2018
comment
Спасибо за отличный ответ! Будет ли решение, когда данные присваиваются через неблокирующее присваивание (каждый драйвер имеет свой отдельный блок always_ff и неактивный снова устанавливает его значение в 'z), потому что тогда нельзя будет использовать провод или? - person ES_major; 21.08.2018
comment
@ES_major Я думаю, что провода могут управляться только операторами assign, поэтому это невозможно. - person Tudor Timi; 22.08.2018