原创 Verilog代码优化之for语句

2008-7-30 22:59 14024 15 22 分类: FPGA/CPLD

Verilog代码优化之for语句<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


       这回来谈谈for语句,硬件里的for语句不像软件那样频繁的使用。一方面是因为for语句的使用是很占用硬件资源的,另一方面是因为在设计中往往是采用时序逻辑设计用到for循环的地方不多。


       下面是一个用到for循环设计的代码:


module test_3(clk,rst_n,data,num);


 


input clk;


input rst_n;


input[12:0] data;     //输入13路数据


output[15:0] num;   //13路数据电平为高的路数


 


reg[3:0] i;


reg[15:0] num;


 


always @ (posedge clk) begin


       if(!rst_n) begin


              num <= 0;


              end


       else begin


              for(i=0;i<13;i=i+1)             //for循环进行计算


                     if(data) num <= num+1;                


              end


end


 


endmodule


             


       这段代码的用意是在一个时钟周期内计算出13路脉冲信号为高电平的个数,一般人都会感觉这个任务交给for循环来做再合适不过了,但是for循环能完成这个任务吗?


       我们来看看仿真的结果:


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


点击看大图


 


       相信你已经发现问题了,为什么每个时钟周期for循环只执行一次num <= num+1呢?笔者也很困惑,或许综合工具遇到for也无能为力了吧!所以,慎用for语句!


 


       补充:首先感谢EDN的网友wp061的指点。Always语句中使用非阻塞赋值<=时,是在always结束后才把值赋给左边的寄存器,因此才出现了上面的情况。我重新用阻塞语句写了如下程序:


 


module test_3(clk,rst_n,data,numout);


 


input clk;


input rst_n;


input[12:0] data;     //输入13路数据


output[15:0] numout;     //13路数据电平为高的路数


 


 


wire[15:0] numout;


reg[3:0] i;


reg[15:0] num;


 


always @ (posedge clk) begin


       if(!rst_n) begin


              num = 0;


              end


       else begin


              for(i=0;i<13;i=i+1) begin           //for循环进行计算


                     if(data) num = num+1;end                    


              end


end


 


assign numout = num;


 


endmodule


 


仿真的波形如下:



点击看大图 


       此波形说明了现在的代码达到了实验目的。看来For语句在这种情况下还是比较省事的,如果不用for语句就比较繁琐了。但是话说回来,for语句综合的效率不高,在对速度要求不高的前提下,还是宁愿用多个时钟周期去实现也不用for语句。


 

文章评论8条评论)

登录后参与讨论

用户377235 2014-4-11 17:31

这两段代码是理解硬件描述不到位的误区 不能靠软件循环来理解 for语句要结合实际硬件电路组成来 。这里阻塞和非阻塞其实表现并没有太大区别。第一句不能实现时由于综合不对 第二句也是由于综合对了要的结果,根本就在于综合策略的问题。 for语句在统计一个位宽信号的时候是对其进行逻辑复制出多个比较电路 最后在一个累加器中累加出一个统计值 使用非阻塞赋值在for中由于具体你实现代码的功能,综合器只会综合一路信号进行统计,我认为是最后第i个位信号才会统计 你可以看看

用户1668914 2014-3-23 21:35

怎么感觉版主的这个帖子写得有问题,阻塞赋值和非阻塞赋值的用法不是固定的吗? 在时钟边沿触发的逻辑不就应该是使用非阻塞赋值么? 还有,即使这里使用了阻塞赋值综合出来的结果也是一样的吧? 但是,RTL设计中慎用FOR语句这确实值得注意。 请指教。

用户1453491 2012-11-19 09:25

我按照做的代码用modelsim6.1做的仿真,发现阻塞和非阻塞仿真的时候i值都是13,m自加不起来,不知道什么原因。

用户377235 2012-4-18 17:11

1.对于第二个仿真图没有看出起始的1是怎么来的 2.7后面为什么是8,而不是9?

用户377235 2012-2-9 22:02

这两端代码是典型的阻塞跟非阻塞理解不够透彻的表现

用户1514923 2011-5-18 21:40

看完,感想中。。 曾经的岁月。。

用户1324799 2011-5-10 17:45

2010-07-03 买的这本书,当时上班每有多少时间看。最近滚蛋了,在家里时间和充裕。 今天早上才在书架上摸出这本书,一口气读到了笔记4,完全不要1小时,发现平时看书多看的面红耳赤,看个一天也看不完一章,这个书好,读起来流畅,中间一点没有停顿,前几天在读的Verilog高级数字设计 一章也没有读完,很多好前后反复推敲,在想,读起来相当费劲,而且基本是读了就忘了。 特权东西的书写的确实好,一读就通,一读就懂,一读就会,一读就记住了。读到笔记本4,发现是图2.9 和2.10是一样的。 看了上面的修改 但是,我还是不太明白,所以我对着书敲了遍代码,发现少了个end,补上,2个代码多在quartus8.1里面仿真了下。 我固定输入1111110000000; 在非阻塞下每个时钟周期 num加1,1,2,3,4,5,6的加 在阻塞下第一个时钟周期就算出1的个数是6了,这个时候我还是这个输入,所以他是6,12,18...的加 结论是 非阻塞每个时钟周期统计1位 阻塞一个时钟周期吧13位里的立马统计出来。 这让我想起了, 有个什么过后更新,立即更新...

用户1458803 2010-10-18 15:27

分析是有问题的。两段代码在综合工具里面估计综合后的结果是一样的。

xucun915_925777961 2010-9-9 13:28

走过,路过……

用户1584993 2010-9-2 14:02

呵呵,还有航航哥的玉照了,最下面是嫂子的杰作吗?
相关推荐阅读
特权ilove314 2016-06-30 21:16
例说FPGA连载6:FPGA开发所需的技能
例说FPGA连载6:FPGA开发所需的技能 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   前面的文字已经做了很多铺垫,相信读...
特权ilove314 2016-06-28 21:09
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-28 21:05
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-26 22:11
例说FPGA连载4:FPGA语言与厂商介绍
例说FPGA连载4:FPGA语言与厂商介绍 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   Verilog与VHDL 说到FP...
特权ilove314 2016-06-23 21:26
例说FPGA连载3:FPGA与其它主流芯片的比较
例说FPGA连载3:FPGA与其它主流芯片的比较 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   FPGA、ASIC和ASSP...
特权ilove314 2016-06-21 20:32
例说FPGA连载2:FPGA是什么
例说FPGA连载2:FPGA是什么 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   2015年伊始,Intel欲出资百亿美金收...
我要评论
8
15
关闭 站长推荐上一条 /2 下一条