systemverilog:在流操作中使用结构作为切片说明符

时间:2013-06-26 22:08:44

标签: system-verilog

typedef struct {
bit y;
bit x;
} t_my_unpkd_struct;

t_my_unpkd_struct a[1:0];
bit [1:0] bb[1:0];

assign { >> {a} } = { << t_my_unpkd_struct {bb} };

以上代码无法编译 - 我做错了什么?我不能将结构用作切片说明符吗?

顺便说一句,我的目的是得到:

a[0].x = bb[1][0]
a[0].y = bb[1][1]
a[1].x = bb[0][0]
a[1].y = bb[0][1]

1 个答案:

答案 0 :(得分:2)

制作struct packed并将{ >> {a} }替换为a

typedef struct packed {
bit y;
bit x;
} t_my_unpkd_struct;

t_my_unpkd_struct a[1:0];
bit [1:0] bb[1:0];

assign a = { << t_my_unpkd_struct {bb} };

简单的试验台:

bit clk; always #5ns clk++;
default clocking cb @(posedge clk);
endclocking
initial begin
    repeat(20) begin
        @(negedge clk);
        void'(randomize(bb));
    end
    #10ns;
    $finish(2);
end
assert property (a[0].x == bb[1][0]);
assert property (a[0].y == bb[1][1]);
assert property (a[1].x == bb[0][0]);
assert property (a[1].y == bb[0][1]);

更新: 以下适用于解压缩的结构:

assign a = { << 2 {bb} };

always_comb { << 2 {a} } = { << t_my_unpkd_struct {bb} };