Передача в модулях как типы - PullRequest
0 голосов
/ 13 мая 2019

У меня есть несколько «уникальных» модулей, которые имеют общие поля.Я хотел бы создать модуль, который может ссылаться на это, скажем, путем восходящей ссылки на имя.Можно ли передать тип модуля в качестве параметра, который можно использовать внутри?Я попробовал это:

  3 module A;
  4   int flag = 0;
  5 endmodule
  6
  7 module B;
  8   int flag = 1;
  9 endmodule
 10
 11 module C;
 12   int flag = 2;
 13 endmodule
 14
 15 module Bind #(parameter type T=A);
 16   initial begin
 17     $display("flat = %0d",t.flag);
 18   end
 19 endmodule
 20
 21 module tb;
 22   bind A Bind#(A) u_bound;
 23 endmodule

Но я получил следующие ошибки компиляции:

-- Compiling module B
-- Compiling module C
-- Compiling module Bind
** Error: test.sv(15): (qverilog-2730) Undefined variable: 'A'.
** Error (suppressible): test.sv(15): (qverilog-2987) Illegal expression as initializer for type parameter 'T'.
-- Compiling module tb
** Error: (qverilog-13069) test.sv(22): near ";": syntax error, unexpected ';', expecting '('.

1 Ответ

2 голосов
/ 14 мая 2019

Только типы данных могут быть параметризованы как типы.

Вы можете использовать эту малоизвестную функцию Verilog, которая позволяет искать имена всех функций вверх

 module A;
    int flag = 0;
    function int get_flag(); return flag; endfunction
 endmodule

  module B;
    int flag = 1;
    function int get_flag(); return flag; endfunction
  endmodule

  module C;
    int flag = 2;
    function int get_flag(); return flag; endfunction
  endmodule

  module Bind #(parameter type T=A);
    initial begin
      $display("flag = %0d",get_flag);
    end
  endmodule

  module tb;
    A aa();
    bind A Bind# u_bound();
  endmodule
...