【方法】Verilog取变量位宽的时候含有变量怎么办

您所在的位置:网站首页 verilog位宽不一样的寄存器可以想加吗 【方法】Verilog取变量位宽的时候含有变量怎么办

【方法】Verilog取变量位宽的时候含有变量怎么办

2024-07-02 23:08| 来源: 网络整理| 查看: 265

在Verilog里面,一般用reg来存储字符串。例如要存储4个字符的字符串,变量应该声明为reg [31:0] str。因为每个字符的宽度为8位,4个字符一共32位。最高位为第31位,最低位为第0位。 字符串在声明时可以给定初始值:reg [31:0] str = "this" 如果我们想要改变字符串中的某个字符,比如更改最后一个字符(称为第0个字符),可以写成str[7:0] = "d",字符串就变成了"thid"。 更改第3个字符:str[31:24] = "a",字符串变为"ahid" 更改第2个字符:str[23:16] = "b",字符串变为"abid" 更改第1个字符:str[15:8] = "c",字符串变为"abcd" 那如果我现在有变量i,想修改第i个字符该怎么办呢?写成str[8 * i + 7:8 * i],编译不通过,提示:ERROR: [VRFC 10-1775] range must be bounded by constant expressions

其实,正确的写法是:str[(8 * i)+:8],意思是从第8*i位开始,往上取8位出来。如果i=2,那么就是从第8*2=16位开始,往上取8位,一直取到第23位结束,也就是[23:16]这8位,刚好是第2个字符。 请看下面的代码:

reg [2:0] i; reg [31:0] str; initial begin for (i = 0; i < 4; i = i + 1) begin str[(8 * i)+:8] = "0" + i; end end

运行结果:str为0x33323130,也就是"3210"这个字符串。

当然,也可以把加号改成减号,倒过来取:

reg [2:0] i; reg [31:0] str; initial begin for (i = 0; i < 4; i = i + 1) begin str[(8 * i + 7)-:8] = "0" + i; end end

运行结果仍然是"3210"这个字符串。 这回,当i=2时,8*i+7=23,指定的是最高位,往下取8位,取的还是[23:16]这8位。

 

如果字符串中字符的个数小于寄存器的位宽,那么Verilog就会在字符串的前面填充"\0"。 例如,写str="has",那么就会在h的前面补一个0,最终寄存器的值就是0x00686173,也就是“\0has”。 所以,如果我们要在字符串末尾加一个字符,可以通过左移运算实现:str = (str > 8,字符串从"\0has"变成"\0\0ha",也就是"ha"(0x00006861)。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3