微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > 微电子学习交流 > 一个systemverilog的问题

一个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.
有什么解决方法吗?

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的情况
上面这段代码是可以综合的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top