2012-11-13 45 views
3

我将SystemVerilog中的代码移植到SystemC。 SV很容易将位/逻辑的压缩结构解释为单个位/逻辑向量。例如:安全地将位/逻辑向量的SystemC结构转换/转换为单个位/逻辑向量

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-style指针是否安全/正确。

回答

4

这里是你自己的答案稍有好转。您不需要转换为字符串,因为sc_lv类型可以与()运算符连接。

所以,你可以简化你的函数是这样的:

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

我想有一种方法通过重载一些运营商为typ_block,使简单的分配工作,但我不知道它是什么。

+0

谢谢这有助于清理它很多 – Rich

+0

dwikle,那个return语句是如何工作的?什么是C++构造的名称来描述'(blk1,blk2,blk3 [...])'? –

+0

罗斯,如果我理解正确,这是因为重载逗号运算符定义为串联sc_lv和类似的类。在[本页]上查看一下(http://www.ht-lab.com/howto/vh2sc_tut/vh2sc_tut2.html)。 – Rich

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; 
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++操作符的限制是您必须使用显式表达式让编译器知道类型转换。这意味着你不能像blockB = (blockA).range(7,0);那样使用,你必须使用blockB = sc_lv<64>(blockA).range(7,0);

+0

谢谢,这有助于清理一些。如果可以的话,我会检查你的答案。 – Rich