2016-07-15 129 views
0

我想連接十進制和字符串。像:Verilog串聯的十進制和字符串文字

parameter AWIDTH = 15; 
... 
... 

wire [AWIDTH-1:0] addra_bus; 
assign addra_bus = cg_one ? {addra} : {AWIDTH, "'bz"}; 

在基本 'cg_one' 的,它會選擇要麼{ADDRA}或{AWIDTH 「」BZ「}。在三元運算符的錯誤條件下,我將AWIDTH與'bz連接起來。如果cg_one是1'b0,我應該在addra_bus中獲得15'bz的值。合理?

合成此代碼時出現問題。我收到以下警告:

WARNING: expression size 56 truncated to fit in target size 15 (VERI-1209) 

這是爲什麼?從哪裏來的大小56?

回答

3

您不應該使用字符串文字。所有你需要做的是

assign addra_bus = cg_one ? addra : 'z; 

'z將擴大到addra_bus的寬度

+2

乍一看,我認爲這是神奇的東西。 :)但不幸的是,它沒有奏效。這次出現了一個錯誤信息:'ERROR:near error'(VERI-1137)' –

+3

這是合法的SystemVerilog(請參閱第17.7.1節「1800-2012 LRM的整數文字常量」),但也許您的綜合工具不支持它。你也可以嘗試'{AWIDTH {1'bz}}',這正是我想你首先想要做的。 –

+1

哦。我想我應該在這裏具體提到Verilog。是的,可能有我的工具不支持它的可能性。無論如何,你的第二個建議{AWIDTH {1'bz}}'起作用了。我希望它能讓我回到'15bz'。感謝您的寫作。 –

1

您正在嘗試將32位AWIDTH和24位"'bz"(總共56位)保存爲15位addra_bus

您應該限制AWIDTH的寬度並增加addra_bus的寬度。例如:

parameter AWIDTH = 6'd30; 

wire [AWIDTH-1:0] addra_bus; 
assign addra_bus = cg_one ? {addra} : {AWIDTH, "'bz"}; 
+0

感謝寫這起來。我很感激。如果我不想以二進制編寫AWIDTH,該怎麼辦?這對我來說是十進制值。 –

0

戴夫已經提到把公交車到高的狀態,你可以做 assign addra_bus = cg_one ? addra : {AWIDTH{1'bz}};但設置公共汽車到「Z」在可驅動芯片級IO信號之前,並不需要可綜合代碼。

如果要在總線上顯示字符串15'bz以進行調試。

reg [7:0] val = {"0"+AWIDTH%10}; 
reg [7:0] val1 = {("0"+AWIDTH/10)}; 
assign addra_bus = cg_one ? {addra} : {val,val1}; 

[假設你PARAM大小僅爲對99。] [根據需要每字符8個比特以上僅顯示「15」的代碼]