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 に答える