可综合模块中的for循环
之前看到资料说,可综合代码中最好别用for循环。
今天看到王金明资料里的examples,【例12.11】(7,4)循环码编码器,
module cycle(c,u,clk);
output[6:0] c;
input[3:0] u;
input clk;
reg[2:0] i;
reg d0,d1,d2,temp;
reg[6:0] c;
always @(posedge clk)
begin
d0=0; d1=0; d2=0; //初始化
for (i=0;i<4;i=i+1) //该for 循环计算码组的前4 个码元
begin
temp = d2 ^ c;
d2 = d1;
d1 = d0 ^ temp;
d0 = temp;
c = u;
end
for (i=4;i<7;i=i+1) //该for 循环计算码组的后3 个码元
begin
temp = d2;
d2 = d1;
d1 = d0 ^ temp;
d0 = temp;
c = temp;
end
end
endmodule
想看看里面for 是如何工作实现的,就Modelsim 了一把,发现:
1.里面的i 第一个上升沿就是‘b111;
2.代码一开始对d0,d1,d2的初始化 赋值0,根本就没有用?
3.代码里面有2个for,一个周期执行一个for,即,上面的2个for 要两个周期才有d0,d1,d2 的值输出。不是对“2个for 需要2个周期执行完”的疑问,只是对 一个周期执行一个for 里面的多次循环( i 从0到3)有些疑问,之前一直认为,执行循环里面的一次吧,发现我错了。
大家自己可以去仿真一下。
为什么我发现的问题1. 2. 让我如何也想不通。大家支支招吧,谢谢
TMD,发帖编辑不了,发现部分字体还自动斜体。
有错也改不了。
应该是:
temp = d2 ^ c;
c = u;
c = temp; 3句中的c 和 u 后都带【i】
将for循环展开替换掉你的for你会容易理解的
always里面的for循环在一个周期内完成
综合器会自动把你的for循环展开成n段的
不是不推荐吧
应该和电路映射上不容易理解
3# rr253
我记得 EDN 网站上有个CPLD\FPGA设计学习视频,里面的解说人就提到,在可综合代码中其实不提倡用for 的。
的确,就算用起来,还真是不好理解。总以为一周期执行一次循环呢。
for循环还是很有用的,用的清楚的话很便利
比如多个电路的复制,流水线,参数化设计等
但一定要清楚最后的综合结果。
公司的话应该有规定怎么写吧
反正我挺看不顺眼RTL里面的for,呵呵
主要是不确定给我综合出来什么东西
通党for,用在示例化器件时,是可以综合的,我试过了.
用在它处时,我试的不多.
在了解综合工具时,我了解到了,逻辑等价类,更是了解到了一些逻辑等价类变换,这种变换会带来一些时序上的改进.
但我也明白了,综合工具通党对锁存器,触发器,都有一定的准则.
1,如果一个HDL语言,用于综合,不同的综合工具综合出的锁存器,触发器可能不同.这体现在锁存器与触发器的互换,block语句与non-block语句的曲别等地方.
2.综合优化时,通常不会优为锁存器,触发器,只会优化组合逻辑.(当然这与我的代码风格也有关系,我通常是不会有一些会产生异义的语句的.触发器在在我写文档时基本确定的,但我还是认为对现在的HDL语言说,综合工具通常只优化组合逻辑.
所以,在HDL语言的语言集中,我只写的是它的一个子集.
呵呵,真想和高手交流啊.
7# qushaobo
哈哈, 说的挺好呀,三人行必有我师焉
其实强大的综合软件工具,其他的大公司也会借用的。
的确,在时序逻辑和综合实现方面需要高手指点。
1# ruiruio4
syntax "for":
All inside codes will be extended according to your loop index number.
If you are creating rtl code, you should be careful about this, because most
of people often put "behavior" statements inside loop body.
For还是要经常用的,方便
首先说明下for while是动态解析的函数,也就是在执行的时候来判断其中的参数是否满足条件。
编译的时候不做处理,直接作为一个类存下来。后端用来仿真或综合取决于参数是否为常量,如果i为常量,我认为是可以综合的。i为变量当然就是行为级的描述,不能综合。对于仿真,for的执行过程应该与c中一样,及在运行时判断。 对于不同的编译器处理方法可能不同,所以不建议在RTL级写for。 如果想用重复申明连线或重复使用实例时,用generate可以进行综合。原因是,generate的循环数一定为常量,就像for中i<固定值。这样编译的时候就可以拆开成相应的模块。
aaaaaaaaaaaaaaaaaaaaaaaaa
11# 4k_hhc
你说的generat是 在VHDL 里面啦,在verilog 里面好像没有吧
或者你可以这么理解:Verilog中的for循环和汇编里面的伪指令是一样的,只是辅助性质的,最后都会被替换掉。
在这里看大家讨论,收获了好多!
FOR 循环综合出来的就串行结构的东西
xuexi.......
做验证的时候可以用点,
还有就是初始化寄存器,
其他时候还是不要用吧
虽然现在的工具能够综合,
还是小心点好
