System Verilog Условное определение типа - PullRequest
0 голосов
/ 21 апреля 2020

Есть ли способ условного выбора между двумя типами на основе значения параметра?

typedef struct packed {
  logic a;
} my_type_1_t;

typedef struct packed {
  logic [1:0] a;
} my_type_2_t;

parameter type type_t = my_type_1_t;

if (MY_PARAM == 1) begin
  typedef my_type_1_t type_t;
  do something...
end else begin
  typedef my_type_2_t type_t;
  do the same something as above with different struct...
end

type_t my_signal;

Как видите, мне нужно выполнить те же операции в предложении else, что и в if предложение, но с другой структурой. Это кажется мне излишним, и мне любопытно, если есть способ избежать дублирования.

Ответы [ 3 ]

0 голосов
/ 21 апреля 2020

Во-первых, вы хотите синтезируемый код? Классы SystemVerilog поддерживают параметризацию и определения структур на уровне классов. Однако большинство инструментов синтеза даже не поддерживают это ограниченное использование конструкции класса в качестве механизма определения области действия.

Пакеты, которые имеют гораздо большую поддержку инструментов синтеза, к сожалению, не имеют возможности параметризации пакетов / структур. Лучшее, что я сделал, это эмулировал параметризуемые структуры с помощью макросов, например:

module mod;
   // parameter *may* need to be untyped so that text substitution macro
   //  works properly without appending any 0's
   parameter MY_PARAM = 1;


   // Macro and struct definitions could be moved to common header file if shared across multiple modules
   typedef struct packed { /* definition */ } my_type_1_t;
   typedef struct packed { /* definition */ } my_type_2_t;
   `define my_type_t(PARAM) my_type_``PARAM``_t


   typedef my_type_t(MY_PARAM) type_t;

   type_t my_signal;


   //   module logic...
endmodule;

Пожалуйста, проверьте мой синтаксис выше, так как я не пытался скомпилировать и протестировать его.

0 голосов
/ 21 апреля 2020

Единственный способ имитировать c нужного вам поведения - использовать параметризованные модули.

Вот простой пример:

typedef struct {
  logic a, b;
} type1_t;

typedef struct {
  logic [1:0] a1, b1;
} type2_t;

module top(input logic clk);

  pmod#(.T(type1_t)) inst1(clk);
  pmod#(.T(type2_t)) inst2(clk);

endmodule

module pmod#(type T=int) (input logic clk);
  logic [1:0] a, b;
  T t;

  if ($typename(T) == "type1_t") begin
     always @(posedge clk) begin
      a = t.a;
      b = t.b;
    end
  end
  else if ($typename(T) == "type2_t") begin
    always @(posedge clk) begin
      a = t.a1;
      b = t.b1;
    end
  end

  // do something with a and b

endmodule
0 голосов
/ 21 апреля 2020

Нет, вы не можете сделать это, потому что имя type_t будет локальным по отношению к блоку generate-if. Но это не имело бы большого смысла, если бы вы могли, потому что код, который ссылается на my_signal, захочет получить доступ к my_signal.b, и в некоторых случаях он не будет существовать.

...