【Day08】for 回圈在硬体的使用及该注意的那些事

for-loop

在 C/C++ 语言中,我们经常用到 for 回圈语句,但在 Verilog 中 for 语句的使用上会有很大的区别。

Verilog 的 for 回圈会经常在 TestBench 上做使用,一方面是 TestBench 只是拿来测试电路功能的正确性,而且在 TestBench 中生成信号用 for 回圈也比较方便,不需一行一行打。

但是在 RTL(Register-Transfer-Level) 中却很少使用 for 回圈,其原因是,for 回圈会被综合器展开为所有变数情况,每个变数独立占用暂存器资源,且每条执行语句并不能有效地重复使用硬体逻辑资源,而这样的情况会造成消耗大量硬体资源,回圈次数越多次,整体合成面积会越大,for 回圈虽然方便,但换来的则是速度上的下降。

虽然 for 回圈不是那麽理想,但还是有使用的场合,例如初始化二维阵列时就需要,因为在 verilog 中不能直接对整个二维列赋值,此时就需要用 index 去跑每一个变数。

EX:

reg [63:0]mem[255:0];
integer i;

always@(posedge clkSys or negedge rst_n)begin
  if(!rst_n)begin
    for(i=0;i<256;i=i+1)begin//verilog没有i++的用法
      mem[i] <= 64'd0;
    end
  end
  else begin
    ......
  end

end

另一个情况就是就是在时间与面积的 trade-off 过後,真的有需要在单独一个 clk 完成一些处理的需求,也可以适当使用 for 回圈,例如双回圈,双回圈可能耗的硬体资源太多,则可以将外回圈拆开,一个 clk 後外回圈的 index 才加一,而内回圈依旧保持。

总结:虽然 for 回圈是可以综合的,而且效率很高。但所消耗的逻辑资源较大。在对 clk 数要求不是很高的情况下,可以多用几个时钟周期来取代 for 回圈的使用。


<<:  认识HTML(六):表格与表单

>>:  [C 语言笔记--Day12] system call 的执行步骤

第 11 天 范本驱动表单的动态检核讯息|ngSubmit

前情提要 昨日实作其中一个英雄表单栏位「姓名」後,演示了如何使用 FormControl 表单控制项...

Day14:内建的 suspend 函式,好函式不用吗? (3)

这是我们内建的 suspend 函式第三篇,让我们看看有哪些吧: joinAll() 还记得 joi...

[ Day 14 ] - 存取网页元素之变更指定内容

上一篇提到可以取得指定的 DOM 节点 今日来介绍可如何透过节点存取及变更文件节点 textCont...

30天程序语言研究

今天是30天程序语言研究的第二十五天,由於最近写unix语言的东西用到很多,所以做了很多笔记,就想说...

day28-认识一些不太熟的伪类选择器(中)

安安,今天继续讲伪类选择器欧!看书才发现...omg原来还有这麽多不知道的伪类选择器!!!原本以为一...