首页 > 解决方案 > 以类成员为驱动程序的网络连续分配

问题描述

我有一个接口网,需要分配类成员。

但是,我不确定如何执行此操作,正如我尝试过的那样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它只分配了一次,没有进行进一步的分配。

有没有办法解决这个问题?

标签: verilogsystem-verilogsystem-verilog-assertions

解决方案


这段代码有几个问题。

  1. 在 a1 的构造和它的第一个引用之间存在竞争条件。assign不允许,因为可能是空引用
  2. always_comb对类变量的变化敏感,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

推荐阅读