前言
对RTL中的循环语法进行展开,实际上在
【驯服野生verilog-mode全记录】day4 —— 对循环展开语法的python脚本外挂支持 中已经完成,这次是对auto_unfold.py的一次更新,需求主要来源是:
因此我尝试升级了脚本。
新特性
支持在/* AUTO_UNFOLD ... END */之间插入IF语句,但是无法插入elif和else(实现起来实在太难了!)。对于一般的使用场景来说,有if语句应该是足够了:
/* AUTO_UNFOLD
#for i 0..8
IF(#i>4#) assign sig#i# = #3*i#;
IF(#i<4#) assign sig#i# = #i#;
END */
键入:U后会生成:
/* AUTO_UNFOLD
#for i 0..8
IF(#i>4#) assign sig#i# = #3*i#;
IF(#i<4#) assign sig#i# = #i#;
END */
//AUTO_UNFOLD_START
assign sig0 = 0;
assign sig1 = 1;
assign sig2 = 2;
assign sig3 = 3;
assign sig5 = 15;
assign sig6 = 18;
assign sig7 = 21;
//AUTO_UNFOLD_END
当然了,还可以加入一些逻辑:
/* AUTO_UNFOLD
#for i 0..8
IF(#i>4 and i<6#) assign sig#i# = #3*i#;
IF(#i<=4 or i>=6#) assign sig#i# = #i#;
END */
//AUTO_UNFOLD_START
assign sig0 = 0;
assign sig1 = 1;
assign sig2 = 2;
assign sig3 = 3;
assign sig4 = 4;
assign sig5 = 15;
assign sig6 = 6;
assign sig7 = 7;
//AUTO_UNFOLD_END
多层循环也是可以的:
/* AUTO_UNFOLD
#for i 0..3
#for j 0..3
#for k 0..3
IF(#i>1 and j>1 and k>1#) assign sig#i#_#j#_#k# = #3*i#;
END */
//AUTO_UNFOLD_START
assign sig2_2_2 = 6;
//AUTO_UNFOLD_END
还有我们常见的代码展开,也可以这样写了:
/* AUTO_UNFOLD
#for i 0..8
IF(#i==0#)assign sel_kernel_size = (bitmap[#i#] ? info#i#_kernel_size : 5'b0) |
IF(#i>0 and i<7#) (bitmap[#i#] ? info#i#_kernel_size : 5'b0) |
IF(#i==7#) (bitmap[#i#] ? info#i#_kernel_size : 5'b0) ;
END */
//AUTO_UNFOLD_START
assign sel_kernel_size = (bitmap[0] ? info0_kernel_size : 5'b0) |
(bitmap[1] ? info1_kernel_size : 5'b0) |
(bitmap[2] ? info2_kernel_size : 5'b0) |
(bitmap[3] ? info3_kernel_size : 5'b0) |
(bitmap[4] ? info4_kernel_size : 5'b0) |
(bitmap[5] ? info5_kernel_size : 5'b0) |
(bitmap[6] ? info6_kernel_size : 5'b0) |
(bitmap[7] ? info7_kernel_size : 5'b0) ;
//AUTO_UNFOLD_END
关于对齐需要说明一下,脚本处理时会将IF(...)删除,其余的再去做展开,因此对齐的时不要把IF(...)算进去就可以了。