有没有办法以类型为条件?

问题描述 投票:0回答:3

我在公共模块中使用参数化类型。

有没有一种说法:

 if( type == TYPE1 ) assign the struct one way
 else if( type == TYPE2 ) assign another way

我在

generate
块中想象这个。

verilog system-verilog parameterized-types
3个回答
4
投票

IEEE1800-2012
§ 6.23 中描述了 type() 运算符。 LRM 的用法示例:

bit[12:0] A_bus, B_bus;
parameter type bus_t = type(A_bus);
generate
  case(type(bus_t))
    type(bit[12:0]): addfixed_int #(bus_t) (A_bus,B_bus);
    type(real): add_float #(type(A_bus)) (A_bus,B_bus);
  endcase
endgenerate

IEEE1800-2012
§ 20.6.1 中还描述了 $typename()
$typename()
返回 s 类型的字符串。 LRM 的用法示例:

// source code            // $typename would return
typedef bitnode;          // "bit"
node [2:0] X;             // "bit [2:0]"
int signedY;              // "int"
packageA;
enum{A,B,C=99} X;         // "enum{A=32'sd0,B=32'sd1,C=32'sd99}A::e$1"
typedef bit[9:1'b1] word; // "A::bit[9:1]" 
endpackage: A
importA::*;
moduletop;
typedef struct{node A,B;} AB_t;
AB_t AB[10];              // "struct{bit A;bit B;}top.AB_t$[0:9]"
...
endmodule

3
投票

是的,您可以使用类型运算符执行生成 if/case 或过程式 if/case,例如:

real r;

if ( type(r) == type(real) ) ...

但不幸的是,无论条件如何,所有分支中的代码仍然必须成功编译。您将无法引用不存在的结构成员。

  typedef struct {int a;} s1_t;
  typedef struct {int a;int b;} s2_t;
  s1_t s;
 initial
      #1 // procedural-if
    if (type(s) == type(s1_t))
      $display("%m s.a = %0d",s.a);
    else if (type(s) == type(s2_t))
      $display("%m s.b ==%0d",s.b); // this will not compile 

-1
投票

$typename 是否有反函数? 我想创建一个给定字符串及其定义的类型。非常简单且人为的示例,假设此函数名为 $name2type:

logic signed [7:0] my_byte_array [16];
initial $display (" type of my_byte_array is %s", $typename(my_byte_array));
// prints type of my_byte_array is logic signed[7:0]$[0:15]

// want same size as my_byte_array but unsigned
$name2type("logic unsigned [7:0]$[0:15]") my_unsigned_byte_array;

感谢您的任何指点或想法!

© www.soinside.com 2019 - 2024. All rights reserved.