以 Class 成员作为驱动程序的网络的连续分配
Continuous Assignment of a net with Class member as driver
我有一个接口网,需要分配class个成员。
但是,我不确定如何做到这一点,因为我已经尝试过 always_comb
,它通过了编译,但仍然没有进行连续赋值。 assign
声明不起作用。
interface analog ();
bit [10:0] r;
endinterface
class abc;
bit [10:0] t;
endclass
module temp();
abc a1;
analog a2 ();
always_comb begin
a2.r = a1.t;
end
initial begin
a1 = new();
a1.t = 10'd35;
$display("a1.t - %0d, a2.r - %0d", a1.t, a2.r);
#1;
a1.t = 10'd21;
$display("a1.t - %0d, a2.r - %0d", a1.t, a2.r);
#1;
a1.t = 10'd67;
$display("a1.t - %0d, a2.r - %0d", a1.t, a2.r);
end
endmodule
// Result -
a1.t - 35, a2.r - 0
a1.t - 21, a2.r - 35
a1.t - 67, a2.r - 35
如您所见,a2.r
只分配了一次,没有进行进一步的分配。
有什么办法可以解决吗?
这段代码有几个问题。
- 您在 a1 的构造与其第一个引用之间存在竞争条件。
assign
是不允许的,因为空引用很可能
always_comb
对 class 变量 a1
的变化敏感,而不是它的任何成员。
- 您的
$display
语句被放置以便看不到 t 的更新值。
试试这个:
module temp();
abc a1;
analog a2 ();
initial wait(a1 != null)
forever begin
a2.r = a1.t;
@a1.t;
end
initial begin
a1 = new();
a1.t = 10'd35;
#1 $display("a1.t - %0d, a2.r - %0d", a1.t, a2.r);
a1.t = 10'd21;
#1 $display("a1.t - %0d, a2.r - %0d", a1.t, a2.r);
a1.t = 10'd67;
#1 $display("a1.t - %0d, a2.r - %0d", a1.t, a2.r);
end
endmodule
我有一个接口网,需要分配class个成员。
但是,我不确定如何做到这一点,因为我已经尝试过 always_comb
,它通过了编译,但仍然没有进行连续赋值。 assign
声明不起作用。
interface analog ();
bit [10:0] r;
endinterface
class abc;
bit [10:0] t;
endclass
module temp();
abc a1;
analog a2 ();
always_comb begin
a2.r = a1.t;
end
initial begin
a1 = new();
a1.t = 10'd35;
$display("a1.t - %0d, a2.r - %0d", a1.t, a2.r);
#1;
a1.t = 10'd21;
$display("a1.t - %0d, a2.r - %0d", a1.t, a2.r);
#1;
a1.t = 10'd67;
$display("a1.t - %0d, a2.r - %0d", a1.t, a2.r);
end
endmodule
// Result -
a1.t - 35, a2.r - 0
a1.t - 21, a2.r - 35
a1.t - 67, a2.r - 35
如您所见,a2.r
只分配了一次,没有进行进一步的分配。
有什么办法可以解决吗?
这段代码有几个问题。
- 您在 a1 的构造与其第一个引用之间存在竞争条件。
assign
是不允许的,因为空引用很可能 always_comb
对 class 变量a1
的变化敏感,而不是它的任何成员。- 您的
$display
语句被放置以便看不到 t 的更新值。
试试这个:
module temp();
abc a1;
analog a2 ();
initial wait(a1 != null)
forever begin
a2.r = a1.t;
@a1.t;
end
initial begin
a1 = new();
a1.t = 10'd35;
#1 $display("a1.t - %0d, a2.r - %0d", a1.t, a2.r);
a1.t = 10'd21;
#1 $display("a1.t - %0d, a2.r - %0d", a1.t, a2.r);
a1.t = 10'd67;
#1 $display("a1.t - %0d, a2.r - %0d", a1.t, a2.r);
end
endmodule