将位/逻辑向量的SystemC结构安全地转换/转换为单个位/逻辑向量

Ric*_*ich 3 verilog system-verilog systemc

我正在从SystemVerilog的代码移植到SystemC.SV很容易将位/逻辑的打包结构解释为单个位/逻辑向量.例如:

typedef struct logic {
  logic [31:0] blk1;  //63:32
  logic [4:0]  blk2;  //31:27
  logic [2:0]  blk3; //26:24
  logic [4:0]  blk4;  //23:19
  logic [2:0]  blk5;  //18:16
  logic [7:0]  blk6;  //15:8
  logic [7:0]  blk7;  //7:0
} typ_block;
...
typ_block blockA;
logic[63:0] blockB;
blockB = blockA; // no problem here
Run Code Online (Sandbox Code Playgroud)

但是使用SystemC并使用sc_lv <>模板,由于类型不匹配,这会产生编译器错误.

struct typ_block {
  sc_lv<32> blk1;  //63:32
  sc_lv<5>  blk2;  //31:27
  sc_lv<3>  blk3; //26:24
  sc_lv<5>  blk4;  //23:19
  sc_lv<3>  blk5;  //18:16
  sc_lv<8>  blk6;  //15:8
  sc_lv<8>  blk7;  //7:0
};
...
typ_block blockA;
sc_lv<64> blockB;
blockB = blockA; // compiler error
Run Code Online (Sandbox Code Playgroud)

是否有一个很好的SystemC支持的方法来做同等的事情?我可以想到潜在的解决方案,但它们不优雅或简洁,我不确​​定c风格的指针转换是否安全/正确.

dwi*_*kle 5

您自己的答案略有改进.您不需要转换为字符串,因为sc_lv类型可以与()运算符连接.

所以你可以像这样简化你的功能:

sc_lv<64> to64bit() { return (blk1, blk2, blk3, blk4, blk5, blk6, blk7); };
Run Code Online (Sandbox Code Playgroud)

我想有一种方法可以通过重载某些运算符来使简单赋值工作typ_block,但我不确定它是什么.