verilog - 以类成员为驱动程序的网络连续分配
问题描述
我有一个接口网,需要分配类成员。
但是,我不确定如何执行此操作,正如我尝试过的那样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
对类变量的变化敏感,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
推荐阅读
- sql - 如何避免这种联合选择
- android - Google Nearby Messages Publish 返回 2806 Forbidden (Android - React Native)
- sql-server - 来自 Windows 服务的用户“NT AUTHORITY\ANONYMOUS LOGON”登录失败
- javascript - 解析 Javascript 对象以显示分层链接目录
- javascript - “d”参数在 .on 事件中返回未定义
- c# - 如何忽略 Specflow 语句中的字母数字文本从转换为参数?
- android - 在后端数据库中存储来自其他 API 的 oauth 令牌
- amazon-web-services - CommaDelimitedList、fn:if 和 fn:select 的 AWS Cloudformation 组合
- docker - 在 Dockerfile 构建中连接到 localhost?
- c# - 包装 String.Join 方法