注意点
1. 时序逻辑中尽量避免for循环,如使用一定注意避免掩盖问题;
2. verilog文件中for循环不能外露,需要有generate块或always块,system verilog中for可以外露,会默认处理为generate for;
3. for循环必须加begin-end,哪怕只有一行执行代码;
4. for begin后面必须有块名,建议大写,避免和信号名重复;
5. 单纯的for循环不支持data[3i+8 : 3i]的取值方式,只支持data[3i +: 8]写法;
尝试如下:

对于非generate来说,只能支持236行的写法,不支持237行写法,会报语法错,
part select
中,: 的右侧不能有变量
对于generate来说,248行和249行都支持;
对于上述不支持的语法报的错误:Verilog报 illegal operand for constant expression,百度搜索原因:
这个错误的直接原因是 Verilog 不支持 Data_i [i*8-1:i*8-8] 这种语法。 如果把向量的位选取写成 vect [msb:lsb] 这种形式,下标 msb 和 lsb 中是不能出现变量的。 如果想在下标中使用变量,Verilog 2001标准支持把题主的代码写成 Data_i [ (i*8-8)+:8],表示从 i*8-8 这位开始,向高数8位,选择这些位。
常规的for循环(非generate):
在Verilog-2001中,可以用变量作为index,进行部分数据选择。具体操作为:
[base_expr +: width_expr] //positive offset
[base_expr -: width_expr] //negative offset
其中base_expr可以是变量,而width_expr必须是常量。+:表示由base_expr向上增长width_expr位,-:表示由base_expr向下递减width_expr位。
而在Verilog-1995中,选择部分位进行输出时,前后index位必须是常量。

被折叠的 条评论
为什么被折叠?



