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

标签 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

但是对于 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

是否有一个良好的 SystemC 支持的方法来完成此等效操作?我可以想到潜在的解决方案,但它们不够优雅或简洁,而且我不确定 c 风格的指针转换是否安全/正确。

最佳答案

这是对您自己的答案的轻微改进。您不需要转换为字符串,因为 sc_lv 类型可以与 () 运算符连接。

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

sc_lv<64> to64bit() { return (blk1, blk2, blk3, blk4, blk5, blk6, blk7); };

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

关于verilog - 将位/逻辑向量的 SystemC 结构安全地转换/转换为单个位/逻辑向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13364464/

相关文章:

verilog - SystemVerilog 端口类型 [网络或变量]?

vhdl - 编译用于FPGA的HDL程序的一般程序是什么?

verilog - 对时间值的数学运算

verilog - 如何在 Verilog 中定义和初始化仅包含向量的向量?

algorithm - 二进制数比较

arrays - 覆盖 systemverilog 中结构数组参数的大小

verilog - 检查所有设置/未设置的位

text - 如何删除 SystemC 启动文本

c++ - 如何通过 systemC tlm_fifo<float> 连接两个模块?

c++ - 是否可以在编译 C++ 代码期间报告每个模块的堆栈使用情况?