如何在 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”。