一个systemverilog的问题
时间:12-12
整理:3721RD
点击:
大家有没有写过这样的systemverilog代码:
bit[399:0] tmp;
bit[199:1] b;
int size_b;
tmp = {1'b1, b[size_b-1:0]};
其中size_b是变量,
编译报错:
The range of part select is illegal:
b[size_b-1]
"size_b-1"
Cannot elaluate the expression in left slicing expression.
The expression must be compiletime constant.
有什么解决方法吗?
bit[399:0] tmp;
bit[199:1] b;
int size_b;
tmp = {1'b1, b[size_b-1:0]};
其中size_b是变量,
编译报错:
The range of part select is illegal:
b[size_b-1]
"size_b-1"
Cannot elaluate the expression in left slicing expression.
The expression must be compiletime constant.
有什么解决方法吗?
tmp用verilog的表达方法: tmp = (1'b1<<size_b)|(b & ((1'b1<<size_b)-1)); 嵌入式的经常这样写C。
int是32bit的,编译器不会管你赋值是多少,直接报越界
thx,方法很巧妙。
论坛里问了一圈,发现方法还是蛮多的,比如这种:
一般来说这种截取部分位宽的逻辑可以用 >> <<来实现
但是左右信号位宽要匹配
现在b是200位
tmp是400位
size_b不确定
这个等式没说明逻辑上tmp多余size_b+1的位怎么生成
给个例子
wire [199:0] tmp_0 = {200{1'b1}} >> (200-size_b);
wire [199:0] tmp_1 = {200{1'b1}} >> (200-size_b-1);
wire [199:0] tmp = ( b[199:0] & tmp_0[199:0] ) | ( tmp_0[199:0] ^ tmp_1[199:0] );
以上代码把200bit的b生成了200bit的tmp
其中tmp的低size_b个bit与b相同
tmp的size_b号bit为1
这段代码只考虑size_b为0~199的情况
上面这段代码是可以综合的