新年快乐!开工大吉!

做芯片第一要追求的是功能,在保证功能都满足的情况下追求性能,在性能满足的情况下追求成本,也就是面积。当然功耗也十分重要。

提高速度和降低面积属于两个矛盾的目标,各自努力的方向基本相反,想要更快的运行速度,就得堆更多的资源,在具体的设计中往往需要折中(Trade off)。

在性能允许条件下采用时分复用更多的逻辑来减少芯片的面积,面积及成本。

加比选

通常情况下面积关系为加法器 > 比较器 > 选择器,乘法器可以认为是多个加法器。

所以就有先选后比,先选后加,先选后乘。

assign sum[4:0] = enable ? (data_a + data_b) : (data_c + data_d);
assign add_a[3:0] = enable ? data_a : data_c;assign add_b[3:0] = enable ? data_b : data_d;assign sum[4:0]   = add_a + add_b;

画个图意思一下。

图中的加法器可以替换成,比较器,乘法器,一个运算单元,甚至巨大的一个模块。

乘法器时分复用

在计算模块中乘法器也是非常大的一部分逻辑,一个设计要考虑PPA最优,一个必须要考虑乘法器的数量多少以及复用能不能最大化,追求最好的设计是整个数据通路中乘法器空闲不下来。

通常的设计是做一个专门的乘法器模块,按系统最大的位宽开辟乘法器位宽逻辑,根据设计流程最大程度上复用乘法器资源。

每一路乘法配备一个vld,用vld来作为当前有效的乘法运算,乘法器的结果随着vld的下一拍进行锁存。从下图可以看出乘法器的复用需要将各个部分的运算时间区分开,不可避免系统的时间会变长,想要缩短时间则可以用更多的乘法器来大幅缩短时间,想要面积更小,则用更少的乘法器资源来时分复用。面积与速度互换思想核心。

always @(*)beginif(mult0_vld)    mult_a[3:0] = mult_a0;else if(mult1_vld)    mult_a[3:0] = mult_a1;else // if(mult2_vld)    mult_a[3:0] = mult_a2;end

第二种选择器写法

assign mult_a[3:0] = ({4{mult0_vld}} & mult_a0)            | ({4{mult1_vld}} & mult_a1)            | ({4{mult2_vld}} & mult_a2)

第二种写法需要保证vld条件不会同时有效,看上去只用了一些门实现,而且没有优先级,感觉比第一种写法逻辑少,但实际上经过工具的优化后,可能消耗逻辑差不多。但是第二种写法在综合后就会是你写的这个样子,而第一种则会综合成一堆组合逻辑门。对于ECO来说,第二种写法更友好,第一种复杂多了。

而我更喜欢第一种写法,因为第一种在收集覆盖率时会更友好。代码覆盖率会清楚的看到哪一行没跑到,条件覆盖率也比较简单。每个if里面就一个条件。

乘法器调用方法,一般是在乘法器的输入保证寄存器输入,结果输出到各个复用模块时打一拍再使用。可以做成在进行完乘法运算后再打拍,这样消耗的寄存器会少很多。画个图意思一下(单bit)。

修改完后的寄存器省了很多,但是乘法器的输出寄存器负载会变大,不过后端综合时约束了max_fan_out工具会自动插buffer和复制寄存器,经过实测还是会节省很多面积。不过这是在时序较好的情况下,如果时序比较紧,这样插多余的buffer会导致时序过不了。

RAM的复用

大于1k的寄存器组使用,考虑用RAM替代,但用RAM读写数据需要时序控制逻辑,并行度会降低。要求并行度高,可使用多个RAM。

从设计的整体来看,RAM也可以复用,前面处理完空闲下来的ram,后面处理也可以使用。

真的要这么多的复用吗?

复用可以是各种的,从单个逻辑运算到一个巨大的IP。那么真的要这么多的复用吗?前面说的复用必然需要分时,所以会导致系统处理时间变长,所以必须在保证处理性能的前提下通过复用来减少面积。

在控制通路上,大大小小的计数器会有很多个,理论上一些计数器也可以复用,但是共用一个计数器意味着,这个计数器的开始和结束逻辑复杂,而到了调试(debug)阶段,必然会是调试变得复杂繁琐。

一个加法器如果要复用的数据比较多,除了是debug看起来复杂之外,增加的选择器逻辑可能也不一定会小。

两个独立的模块中有部分相同的逻辑,是否真的有必要在提高了复杂度和模块之间的耦合度的情况下去复用,这也需要考虑。

到了项目后期一个小改动也是需要回归测试所有的测试用例,为了一小点减少逻辑而付出相对巨大的工作量从而影响进度,总的来说获得的边际收益是非常小的。

所以复用虽好,但也要适时、适度。

Verilog代码设计之时分复用相关推荐

  1. 手把手带你实现SDRAM控制器(带Verilog代码)

    上篇博客,我们了解了SDRAM的控制命令以及寻址方式,SDRAM芯片需要配合专门的控制电路使用才能发挥功能,这一节我们将一步步分析,使用Verilog搭建一个SDRAM驱动控制器. 目录 学习目标 问 ...

  2. 异步FIFO设计:各个模块的作用及Verilog代码详解

    实现原理参考:异步FIFO---Verilog实现_alangaixiaoxiao的博客-CSDN博客_异步fifo 代码参考:IC基础(一):异步FIFO_MaoChuangAn的博客-CSDN博客 ...

  3. 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|verilog代码|Testbench|仿真结果)

    数字分频器设计 一.前言 二.偶数分频 2.1 触发器级联法 2.2 计数器法 2.3 verilog代码 2.4 Testbench 2.5 仿真结果 三.奇数分频 3.1 占空比非50%奇数分频 ...

  4. Verilog RTL 代码设计新手上路

    1.      做一个4选1的mux,并且进行波形仿真 和2选1的mux对比,观察资源消耗的变化: 实验分析:4选1的mux实际上就是在2选1的mux上进行拓展,选用2位的控制信号控制4位输入信号的选 ...

  5. 【Verilog零基础入门-边看边练】学习笔记——第三讲 组合逻辑代码设计和仿真(补码转换和七段译码逻辑设计)(二)

    二.七段译码逻辑设计 所需软件 Verilog编程软件:Lattice Diamond(3.11.0.396.4_Diamond_x64) Verilog仿真软件:ModelSim SE-64 10. ...

  6. 基于 FPGA 的 RISC CPU 设计(2)详细的模块设计思路及其 Verilog 代码

    引言         其实,一个 CPU 的设计中,各个子模块都是比较基本的.比较简单的,只是组合起来的一个整体架构会比较复杂而已,无论是时序路径,还是数据通路和控制通路,这里,主要详细介绍整个微架构 ...

  7. Verilog RTL 代码设计示例

    实验一.做一个4选1的mux,并且进行波形仿真和2选1的mux对比,观察资源消耗的变化 四选一mux代码如下: RTL视图如下: 波形仿真如下: 2选1的mux资源消耗情况: 4选1的mux资源消耗情 ...

  8. Verilog代码规范I

    Verilog代码规范I "规范"这问题 "规范"这个富含专业气息的词汇(个人感觉),其实规范这种东西,就是大家都约定熟成的东西,一旦你不遵守这个东西,专业人士 ...

  9. 移位寄存器专题(verilog HDL设计)

    目录 移位寄存器简介 分类 4位右移位寄存器工作原理 1. 16位右移位寄存器 2. 16位左移寄存器 3. 串行输入并行输出寄存器 4. 并行输入串行输出移位寄存器 移位寄存器简介 移位寄存器内的数 ...

最新文章

  1. Swift - 使用 Protocol 避免框架之间循环引用
  2. nginx安装第三方模块echo
  3. “玩转课堂”基本构想
  4. python启动多个进程_Python程序中的进程操作--—--开启多进程
  5. 科技英语翻译计算机化考试,2017年英语四级翻译范文之考公热
  6. 分布式id-数据库实现
  7. eclipse及myeclipse改变编码
  8. python编程是干嘛的-Python这么火到底能干啥?
  9. spring mvc 解决中文response乱码
  10. 集合竞价如何买入_教你几招!什么是集合竞价?散户如何参与集合竞价?
  11. Squid 代理服务之反向代理服务器架构搭建
  12. staring mysql.the_mysql 启动异常失败 Starting MySQL..The server quit without updating PID file
  13. 浙江大学计算机科学与技术学院导师,浙江大学计算机科学与技术学院导师介绍:杨莹春...
  14. 安装uwsgi 报错 是什么原因??
  15. FX5u控制4个伺服,一个完整的项目 回原点、JOG手动、绝对定位、相对定位、控制等部分
  16. Matlab GUI编程技巧(十三):checkbox创建复选框
  17. Feedforward ANC 主动降噪原理
  18. 模拟输入H.264流,输出封装格式文件(API版)
  19. 为什么说深度学习和机器学习截然不同?
  20. 穷人和富人的思维方式

热门文章

  1. 29.typedef
  2. 详解设计模式:中介者模式
  3. 如何通过备份 Windows 7 “ 两个激活文件”实现重装操作系统后的自行激活?
  4. 小A的最短路(LCA、倍增算法学习)
  5. 批处理bat实现创建、复制、删除文件及文件夹
  6. 计算机高中教育日志,高中日记范文
  7. 今天高考╮(╯_╰)╭
  8. 了解RAC(ReactiveCocoa)
  9. Lake Shore亥姆霍兹线圈
  10. Vue 新手入门项目 在线翻译