十进制和字符串文字的 Verilog 连接
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,我应该得到 15'bz 作为 addra_bus 中的值。有道理吗?
问题出在合成这段代码时。我收到警告:
WARNING: expression size 56 truncated to fit in target size 15 (VERI-1209)
为什么会这样? 56 码从哪里来?
您正在尝试默认将 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"};
您不应该使用字符串文字。您只需
assign addra_bus = cg_one ? addra : 'z;
'z
将扩展到 addra_bus
的宽度
正如 Dave 已经提到的将总线置于高状态,你可以这样做
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”]
我想将小数点与字符串连接起来。喜欢:
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,我应该得到 15'bz 作为 addra_bus 中的值。有道理吗?
问题出在合成这段代码时。我收到警告:
WARNING: expression size 56 truncated to fit in target size 15 (VERI-1209)
为什么会这样? 56 码从哪里来?
您正在尝试默认将 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"};
您不应该使用字符串文字。您只需
assign addra_bus = cg_one ? addra : 'z;
'z
将扩展到 addra_bus
正如 Dave 已经提到的将总线置于高状态,你可以这样做
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”]