1.前言
最近幫朋友搞定一個小問題,記錄一下。不啰嗦,直接上結論:當某個信號出現(xiàn)多于一個驅(qū)動源的時候,或者某個信號是雙向(inout)的時候,都需要使用wire來完成線網(wǎng)連接。具體用法就是聲明某個信號為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. 實例代碼
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 *.log4.仿真結果
5.報錯信息查詢
如下圖所示,查詢報錯信息的含義,xrun甚至還給出了解決方案,通過添加工具提供的選項-warn_multiple_driver的確可以將這個*E的Error降為Warning,但是這不是問題的根源。
6. 問題的根源
如下圖所示,第4行和第5行的用法都是對的,第2行和第3行的用法都是錯誤的。
7. Summary& Conclusion
在SystemVerilog中,類型可以分為線網(wǎng)(net)和變量(variable)。線網(wǎng)的賦值設定與Verilog的要求相同,即線網(wǎng)賦值需要使用連續(xù)賦值語句(assign),而不應該出現(xiàn)在過程塊(initial/always)中;相比于線網(wǎng)驅(qū)動的限制,變量(var)類型的驅(qū)動要求就沒有那么多了,如logic [15:0] signal_b,該變量默認類型是var(變量),對它可以使用連續(xù)賦值或過程賦值。
簡言之,可以在module中的數(shù)值存儲和線網(wǎng)連接,多數(shù)情況下使用logic類型變量,而很少有只能使用wire的情況。那么什么時候需要使用wire類型呢?就是本文的這種scenario:當某個信號出現(xiàn)多于一個驅(qū)動源的時候,或者某個信號是雙向(inout)的時候,都需要使用wire來完成線網(wǎng)連接。具體用法就是聲明某個信號為wire sigal_a;或者wire logic signal_a;就可以了。
編輯:黃飛
-
信號處理
+關注
關注
48文章
992瀏覽量
103154 -
Verilog
+關注
關注
28文章
1343瀏覽量
109925 -
Makefile
+關注
關注
1文章
125瀏覽量
19158
原文標題:SystemVerilog中如何處理信號的雙驅(qū)動問題
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論