SystemVerilog:处理信号双驱动问题解析

电子说

1.3w人已加入

描述

1.前言

最近帮朋友搞定一个小问题,记录一下。不啰嗦,直接上结论:当某个信号出现多于一个驱动源的时候,或者某个信号是双向(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 ......).

2. 实例代码

Makefile

 

 

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

3.Makefile脚本

all:clean
  xrun -sv -64bit -access rwc -top test ./*.sv
clean:
  rm -rf *.d *.history *.log
  4.仿真结果

 

 

Makefile

5. 报错信息查询

如下图所示,查询报错信息的含义,xrun甚至还给出了解决方案,通过添加工具提供的选项-warn_multiple_driver的确可以将这个*E的Error降为Warning但是这不是问题的根源。

Makefile

6. 问题的根源

如下图所示,第4行和第5行的用法都是对的,第2行和第3行的用法都是错误的。

Makefile

7. Summary & Conclusion

在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;就可以了。

编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分