[英]Verilog concatenation of decimal and string literal
我想将十进制与字符串连接起来。 喜欢:
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号从哪里来?
您不应该使用字符串文字。 您需要做的就是
assign addra_bus = cg_one ? addra : 'z;
'z
将扩展为addra_bus的宽度
您正在尝试默认将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"};
正如Dave已经提到的将总线置于高电平状态,您可以assign addra_bus = cg_one ? addra : {AWIDTH{1'bz}};
assign addra_bus = cg_one ? addra : {AWIDTH{1'bz}};
但是,在驱动芯片级IO信号之前,不希望将总线以可合成的代码设置为“ z”。
如果要在总线上显示字符串15'bz进行调试。
reg [7:0] val = {"0"+AWIDTH%10};
reg [7:0] val1 = {("0"+AWIDTH/10)};
assign addra_bus = cg_one ? {addra} : {val,val1};
[假设参数大小只有99。] [因为每个字符需要8位,所以上面的代码仅显示“ 15”]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.