3

我正在将代码从 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 风格的指针转换是否安全/正确。

4

3 回答 3

5

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

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

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

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

于 2012-11-14T03:53:02.337 回答
1

这是使用 C++ 类型转换运算符重载来替换to64bit().

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

    operator sc_lv<64>() const {
        return sc_lv<64>((blk1.to_string() + blk2.to_string() + ...).c_str());
    }
};

typ_block blockA;
sc_lv<64> blockB;
blockB = blockA;

这个 C++ 运算符的限制是你必须使用显式表达式让编译器知道类型转换。这意味着你不能使用 like blockB = (blockA).range(7,0);,你必须使用blockB = sc_lv<64>(blockA).range(7,0);.

于 2012-11-14T15:12:23.767 回答
0

编辑:我将这 3 个答案结合到以下内容:

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

  // replacing the commented version by combining jclin's and dwinkle's answers
  // sc_lv<64> to64bit() { return (sc_lv<64>((blk1.to_string() + blk2.to_string() + blk3.to_string() + blk4.to_string() + blk5.to_string() + blk6.to_string() + blk7.to_string()).c_str())); };
  operator sc_lv<64>() const { return (blk1, blk2, blk3, blk4, blk5, blk6, blk7); };
};
...
typ_block blockA;
sc_lv<64> blockB;
blockB = blockA;
于 2012-11-13T18:14:16.240 回答