如何在 Verilog 上显示字符串
How to Display String on Verilog
我想显示前 5 个字符,但在我的代码中它从末尾开始显示:
module TEST_gate;
reg[8*5:1]str1;
initial begin
str1="HelloWorld";
$display("str1= %s",str1);
我想显示 Hello
但它显示 World
。
您的 reg
不够宽,无法容纳字符串的全部 10 个字符。要存储所有字符,请更改:
reg[8*5:1]str1;
至:
reg[8*10:1]str1;
请参阅 IEEE 标准 1800-2017,第 5.9 节字符串文字。
A string literal can be assigned to an integral type, such as a packed
array. If the size differs, it is right justified. To fully store a
string literal, the integral type should be declared with a width
equal to the number of characters in the string multiplied by 8.
那么你需要select一个范围根据你的显示的前5个字符
如果您在模拟器中启用 SystemVerilog 功能,则可以改用 string
数据类型:
module tb;
reg[8*10:1]str1;
string str2;
initial begin
str1="HelloWorld";
str2="HelloWorld";
$display("str1= %s",str1);
$display("str1= %s",str1[80:41]);
$display("str2= %s",str2);
$display("str2= %s",str2.substr(0,4));
end
endmodule
打印:
str1= HelloWorld
str1= Hello
str2= HelloWorld
str2= Hello
参考6.16.8小节Substr().
在 Verilog 中,字符串字面量只是打包的位数组(或位向量),每个字符都是 8 个 ASCII 位。字符串中第一个字符的最左边位是向量的 MSB,最后一个字符的最右边位是向量的 LSB。
您的“HelloWorld”字符串文字是 10 个字符,压缩了一个 80 位压缩数组,您正试图将它分配给一个 40 位变量。对于从较大的整数变量到较小的整数变量的任何赋值,Verilog 右对齐并默默地截断左侧的位,在您的情况下,这些位表示“Hello”。
我想显示前 5 个字符,但在我的代码中它从末尾开始显示:
module TEST_gate;
reg[8*5:1]str1;
initial begin
str1="HelloWorld";
$display("str1= %s",str1);
我想显示 Hello
但它显示 World
。
您的 reg
不够宽,无法容纳字符串的全部 10 个字符。要存储所有字符,请更改:
reg[8*5:1]str1;
至:
reg[8*10:1]str1;
请参阅 IEEE 标准 1800-2017,第 5.9 节字符串文字。
A string literal can be assigned to an integral type, such as a packed array. If the size differs, it is right justified. To fully store a string literal, the integral type should be declared with a width equal to the number of characters in the string multiplied by 8.
那么你需要select一个范围根据你的显示的前5个字符
如果您在模拟器中启用 SystemVerilog 功能,则可以改用 string
数据类型:
module tb;
reg[8*10:1]str1;
string str2;
initial begin
str1="HelloWorld";
str2="HelloWorld";
$display("str1= %s",str1);
$display("str1= %s",str1[80:41]);
$display("str2= %s",str2);
$display("str2= %s",str2.substr(0,4));
end
endmodule
打印:
str1= HelloWorld
str1= Hello
str2= HelloWorld
str2= Hello
参考6.16.8小节Substr().
在 Verilog 中,字符串字面量只是打包的位数组(或位向量),每个字符都是 8 个 ASCII 位。字符串中第一个字符的最左边位是向量的 MSB,最后一个字符的最右边位是向量的 LSB。
您的“HelloWorld”字符串文字是 10 个字符,压缩了一个 80 位压缩数组,您正试图将它分配给一个 40 位变量。对于从较大的整数变量到较小的整数变量的任何赋值,Verilog 右对齐并默默地截断左侧的位,在您的情况下,这些位表示“Hello”。