Может ли межсоединение быть разрешено в тип структуры? - PullRequest
0 голосов
/ 10 сентября 2018

Я получаю сообщение об ошибке при разработке приведенного ниже кода sv. Может ли соединение разрешиться в struct?

 struct {
    byte a;
    reg b;
    shortint unsigned c;
  } myLocalStruct;

module top;
    interconnect n;
    structData sD(n);
endmodule

module structData( myLocalStruct x);

  initial begin
    $display ("a = %b b = %b c = %h", x.a, x.b, x.c);
    $display ("a = %b b = %b c = %h", x.a, 
         x.b, x.c);
     #1  $finish;
   end
 endmodule

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Две проблемы с вашим кодом.

  • MylocalStruct должно быть typedef, а не переменной
  • Как провод, MylocalStruct должен содержать только 4 типа состояний. Так что меняй
    • byte к `логической подписи [7: 0]
    • shortint unsigned до logic [15:0]
0 голосов
/ 11 сентября 2018

да, вы можете использовать interconnect с типом struct. Однако, чтобы объявить структуру как тип порта, вам нужно использовать typedef (как в ответе Daves).

Кроме того, смысл interconnect состоит в том, чтобы обеспечить соединение без модулей между модулями, поэтому нет смысла использовать его в одном модуле.

С лрм 6.6.8:

Сеть или порт, объявленные как межсоединения (сеть или порт межсоединения), указывают на типизированную или общую сеть. Такие сети или порты могут выражать только сетевой порт и терминальные соединения и не должны использоваться ни в каких процедурный контекст, ни в каких непрерывных или процедурных непрерывных назначениях Соединительная сеть или порт не должен использоваться ни в каком выражении, кроме выражения net_lvalue, в котором все сети или порты в Выражение также являются взаимосвязанными сетями. Массив межсоединений должен считаться действительным, даже если разные биты в массиве разрешаются в разные типы сетей, как показано в следующем примере.

В стандарте есть несколько примеров, вот еще один простой пример использования взаимосвязи со структурами:

package is_pkg;
   typedef struct {
      bit         a,b,c;
   } S;
endpackage:is_pkg

module top();
   interconnect  bus;

   tb tb(bus);
   dut dut(bus);

endmodule // top

module tb import is_pkg::*; (output S so);
   initial
     so = '{0,1,1};
endmodule // tb

module dut import is_pkg::*; (input S si);
   always @*
     $display("struct: %b%b%b", si.a, si.b, si.c);

endmodule // dut
0 голосов
/ 10 сентября 2018

System Verilog LRM 1800-2017 сообщает следующее для правила подключения к порту.

Недопустимо подключать переменную порта к порту interconnect или interconnect net.

...