以 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 只分配了一次,没有进行进一步的分配。

有什么办法可以解决吗?

这段代码有几个问题。

  1. 您在 a1 的构造与其第一个引用之间存在竞争条件。 assign 是不允许的,因为空引用很可能
  2. always_comb 对 class 变量 a1 的变化敏感,而不是它的任何成员。
  3. 您的 $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