如何解决在施加力之前分离 SystemVerilog 网络
我想从我的测试台强制向下传递一个信号。模块是根据原理图自动创建的(无法更改设计),并且它们主要基于 wire
类型。
可以在 EDA play ground 上找到代码示例。
//top level module
module dummy1(input A,output B);
dummy2 u_dummy2(A,B);
always @(A)
begin
assert (A == 1'b0) else $error("Force reached this level");
end
endmodule
module dummy2(input A,output B);
dummy3 u_dummy3(A,B);
endmodule
module dummy3(input A,output B);
assign B = A;
endmodule
如果我在 A
中强制 dummy3
,它会在 A
和 dummy2
中更改 dummy1
,这是预期的。我想知道是否有办法将 A
中的 dummy3
与 A
中的 dummy2
分开,以便不会对顶级模块施加力。
module dummy_tb;
logic A,B;
dummy1 u_dummy1(A,B);
initial
begin
A = 0;
$display("step0: A=%b B=%b",u_dummy1.A,u_dummy1.B);
#1;
//force A1 to 1
force u_dummy1.u_dummy2.u_dummy3.A = 1'b1;
#1;
$display("step1: A=%b B=%b",u_dummy1.B);
release u_dummy1.u_dummy2.u_dummy3.A;
#1;
$display("step2: A=%b B=%b",u_dummy1.B);
//TODO: find something to separate A in u_dummy3 from A in u_dummy2,then force
end
endmodule
解决方法
我想不出一种方法可以在不更改设计模块的 Verilog 源代码的情况下“分离”网络,但是您也可以通过在 {{1} 中强制 A
来实现类似的效果}:
dummy2
,
我认为这种行为源于标准中的几句引用:
-
23.3.3 端口连接规则: 每个端口连接应是源到宿的连续分配,其中一个连接项应为 一个信号源,另一个是信号接收器。该指派应为从 输入或输出端口的源接收器。
这使 dummy3.A 成为接收器,而 dummy_tb.A 成为源。
-
10.6.2 强制和释放程序声明:网络上的强制程序声明应覆盖网络的所有驱动器——门输出、模块输出、 和连续赋值——直到在网络上执行释放过程语句。释放时, 网应立即分配由网的驱动程序确定的值。
这使得 dummy_tb.A 成为 dummy3.A 的驱动程序;所以,基本上 verilog 被迫在途中强制所有输入端口。
因此,如果不强制上述层次结构中的端口为不同的值或强制输出低级模块中的连续分配(force dummy3.B),则无法做您想做的事情。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。