首页 > 解决方案 > 系统 Verilog 条件类型定义

问题描述

有没有办法根据参数值有条件地在两种类型之间进行选择?

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,但在不同的结构上。这对我来说似乎是多余的,我很好奇是否有办法避免重复。

标签: typedefsystem-verilog

解决方案


模仿您想要的行为的唯一方法是使用参数化模块。

这是一个简单的例子:

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

推荐阅读