我想根据 SV LRM 计算出一根线/寄存器中连续分配的数量是合法的。
我查看了 verilog 和 SV LRM,它说明了以下内容。
"Continuous assignments shall drive values onto nets or variables" - SV LRM 10.3
这意味着与 verilog 不同,允许对 reg 进行连续分配。
(连续分配应将值驱动到网络上 - verilog LRM 6.1)
"The continuous assignment statement shall place a continuous assignment on a net or variable data type." - SV LRM 10.3.2
这意味着线路/寄存器上的连续分配数量限制为 1。
综合以上两点,
我得出的结论是,wire 和 reg 在 SV 中只能有一个连续分配。
然后我想在Modelsim中检查编译情况。
> testing multi assignments in reg
module test_1;
reg a;
assign a = 1;
assign a = 0;
endmodule
控制台:“'a'由多个连续分配驱动”
因此,该编译很好地找到了 reg 上的多重驱动。没什么可抱怨的。
>testing multi assignments on wire
module test_2;
wire a;
assign a = 1;
assign a = 0;
endmodule
控制台:“ SVtest.sv 编译成功”
我预计结果会给出错误。
然而,这个编译并没有解决在线多驱动程序的错误。
这意味着 UVA 允许在线双驱动,这与我的预期完全不同。
问题摘要:
我对 SV LRM(线路/寄存器上只允许一次连续分配)的解释是否错误?或者只是模拟器没有严格反映SV LRM?
此外,我之前所做的解释(在verilog中,连续分配只允许在线一次,但不允许在reg上)也是错误的吗?(基于“连续分配应将值驱动到网络上 - verilog LRM 6.1”)
一个网络/电线可以有多个连续的分配,但不能有程序性的分配。一个变量可以有多个过程赋值,或者一个连续赋值。请参见https://blogs.sw.siemens.com/verificationhorizons /2013/05/03/wire-vs-reg/