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

本文详细讲解了如何在Verilog中使用reg存储字符串,包括字符串初始化、字符替换和根据变量i动态修改指定位置字符的方法。还介绍了字符串边界检查和特殊字符处理,如填充''和移位操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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) | "e",字符串变成"hase"(0x68617365)。
也可以写成str = {str[23:0], "e"}。

去掉字符串的最后一个字符,直接右移8位就可以了:str = str >> 8,字符串从"\0has"变成"\0\0ha",也就是"ha"(0x00006861)。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巨大八爪鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值