Verilog在不改变内部状态的情况下对模块输出施加力

Verilog在不改变内部状态的情况下对模块输出施加力,verilog,simulation,system-verilog,register-transfer-level,digital-design,Verilog,Simulation,System Verilog,Register Transfer Level,Digital Design,在我的测试台中,我想通过在RTL中强制某个模块的输出来模拟系统条件: force DUT.driving_module.xx = 0; 但当使用force命令执行此操作时,驱动模块内输出的导线也会受到强制,这会导致系统的其他部分也受到影响。 我真正需要的是强制模块输出,而不改变其内部状态,如下所示: 我根本无法修改RTL代码。有没有办法在测试台上实现这一点 当端口连接两侧都有一根导线时,导线会折叠成一根导线 方法是在模块内部使用逻辑而不是导线。在SystemVerilog的任何地方,您都应该

在我的测试台中,我想通过在RTL中强制某个模块的输出来模拟系统条件:

force DUT.driving_module.xx = 0;
但当使用force命令执行此操作时,驱动模块内输出的导线也会受到强制,这会导致系统的其他部分也受到影响。 我真正需要的是强制模块输出,而不改变其内部状态,如下所示:


我根本无法修改RTL代码。有没有办法在测试台上实现这一点

当端口连接两侧都有一根导线时,导线会折叠成一根导线

方法是在模块内部使用
逻辑
而不是
导线
。在SystemVerilog的任何地方,您都应该使用
wire
的唯一位置是信号是否有多个驱动器

在Verilog中,您始终可以将模块的输出端口设为a
reg


在任何一种情况下,作为变量的输出端口都会为其在更高级别模块中连接的任何对象创建隐式连续赋值。连续分配是单向的,力不会传播回模块。

在某些模拟器中,如果将调试标志添加到模拟构建中,则不会进行逻辑线折叠。这在VCS、afaik和我认为ncsim,或者Cadence本周称之为的任何东西中都有效。然后,您可以对导线执行
强制
放置
,这样只会影响“下游”导线。一点也不现实,但很有用。@dave_59事实上事情有点复杂。为了简单起见,我没有提到我的设计是一个由原语组成的网表(维护原始RTL设计的层次结构)。因此,导线及其驱动器都由合成工具定义。这就是我所说的“不能修改代码”的意思。为什么你可以要求一个工具为你修改代码,但你自己却不能?当然,你可以修改代码,它只是一个文本文件。当然,我可以继续修改网络列表,但它不会很整洁-手动修改自动生成的代码几乎从来都不是一个好主意,如果重新编译设计,你必须再做一次,没有文档,等等……我想这取决于使用
force
语句的初衷。如果您使用它来调试未知问题,或者验证潜在的修复,那么force无论如何都是一个临时语句。如果您这样做是为了快速初始化代码块,那么可能还有其他特定于工具的替代方法。