systemverilog中信号的多驱动问题
当某个信号出现多于一个驱动源的时候,或者某个信号是双向(inout)的时候,都需要使用wire来完成线网连接。具体用法就是声明某个信号为wire sigal_a;或者wire logic signal_a;就可以了。
注意直接声明为logic signal_a;是不行的,会报类似如下的错误:xmelab: *E,ICDCBA: Illegal combination of driver and output clockvar to variable 'signal_a' detected (output clockvar found in ......).
interface test_if(input clk);
//var logic multi_drv_sig;//code bug
logic multi_drv_sig;//code bug
//wire logic multi_drv_sig;//ok
//wire multi_drv_sig;//ok
clocking cb @(posedge clk);
inout multi_drv_sig;
endclocking
modport modp_0(output multi_drv_sig);
modport modp_1(input multi_drv_sig);
endinterface
module test();
test_if test_if0();
assign test_if0.modp_1.multi_drv_sig=0;
endmodule
all:clean
xrun -sv -64bit -access rwc -top test ./*.sv
clean:
rm -rf *.d *.history *.log
如下图所示,查询报错信息的含义,xrun甚至还给出了解决方案,通过添加工具提供的选项-warn_multiple_driver的确可以将这个*E的Error降为Warning,但是这不是问题的根源。
总结
在SystemVerilog中,类型可以分为线网(net)和变量(variable)。线网的赋值设定与Verilog的要求相同,即线网赋值需要使用连续赋值语句(assign),而不应该出现在过程块(initial/always)中;相比于线网驱动的限制,变量(var)类型的驱动要求就没有那么多了,如logic [15:0] signal_b,该变量默认类型是var(变量),对它可以使用连续赋值或过程赋值。
简言之,可以在module中的数值存储和线网连接,多数情况下使用logic类型变量,而很少有只能使用wire的情况。那么什么时候需要使用wire类型呢?就是本文的这种scenario:当某个信号出现多于一个驱动源的时候,或者某个信号是双向(inout)的时候,都需要使用wire来完成线网连接。具体用法就是声明某个信号为wire sigal_a;或者wire logic signal_a;就可以了。
浙公网安备 33010602011771号