0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于代码与硬件电路的对应关系

GReq_mcu168 来源:玩转单片机 作者:玩转单片机 2020-12-09 15:59 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1.Verilog HDL描述

可综合电路Verilog HDL语言是对已知硬件电路的文本描述。所以编写前:

对所需实现的硬件电路“胸有成竹”; 牢记可综合Verilog HDL与电路结构一一对应的关系; 确认电路指标是什么:性能?面积? 硬件思维方式,代码不再是一行行的代码而是一块一块的硬件模块;

达到以上几点,就可以写出行云流水般的高质量代码。关于代码与硬件电路的对应关系,参见如下图片,引用自Synopsys官方文档和几本参考书:

13d66892-33d7-11eb-a64d-12bb97331649.jpg

1410cf0a-33d7-11eb-a64d-12bb97331649.jpg

14408e66-33d7-11eb-a64d-12bb97331649.jpg

148acad0-33d7-11eb-a64d-12bb97331649.jpg

14d4a506-33d7-11eb-a64d-12bb97331649.jpg

150bb0d2-33d7-11eb-a64d-12bb97331649.jpg

1547a88a-33d7-11eb-a64d-12bb97331649.jpg

156b8188-33d7-11eb-a64d-12bb97331649.jpg

2、自动化生成代码如果一定要有奇淫技巧的话,那么代码自动化生成技术就一定可以配得上这个称号。

近十年来,数字集成电路规模和复杂度飞速提高。这给数字集成电路工程师带来了不仅是脑力上的劳动的增加,更多是体力重复性工作的增多。传统的手工代码的编写存在很多弊端。

首先对于模块的代码工程师,要面对许多设计文件。而这些文件之间可能相互不一致,给代码的编写带来了很多的困扰。

其次,代码工程师需要将这些文件中的很多设计信息体现在代码中,其中一些信息是重复性的誊写。这不仅带来了很多枯燥复杂的工作量而且人工参与过多也容易引入很多粗心带来的错误。

再次,由于各个模块连接信号之多导致信号文件的手写工作量很大。每个信号文件小则几千行大则上万行信息。而且一旦有信号连接的变动需要相应修改多个模块的信号文件。

最后,如果设计文件改动相应的设计文件很容易出现哪几处忘记改动的问题。

而Perl脚本语言又有着强大的处理文本的能力。将脚本语言应用于数字电路设计中,作为设计文档和EDA工具的黏合剂,能够大大增加设计的速度。

具体方法为:使用脚本语言从设计文档中提取有用的信息来生成想要的Verilog HDL代码,从而大大减少了IC设计者的工作量,并提高了代码的质量。其好处有: (1)很好的设计一致性:保证了设计概念一旦变动即设计文档稍加修改,对应的Verilog HDL代码就会相应的改变,不需要工程师手动改变代码。 (2)兼容性强:该自动生成代码工具中设置了一个配置文件,供设计工程师的配置修改。对于不同的项目,通过修改配置该文件可以直接是代码相应变化,有一定的灵活性。此外,该自动生成代码工具已经应用于两个以上项目中,实践证明有很好的兼容性。 (3)代码维护方便:对于设计代码的更新或升级,只需要重新运行下该工具即可,不需要一点点该写代码。 (4)使用简单:将很多脚本集成在一起,使用工具时只需要运行一条命令即可。本文将举一个Perl语言在代码自动生成中的应用实例,下图为一SoC芯片中全芯片的时钟控制电路框图:

15975362-33d7-11eb-a64d-12bb97331649.jpg

时钟控制模块实现配置PLL参数、选择输出时钟源、时钟分频、时钟门控、bank切换、输出时钟等功能。3G、4G是系统通讯单元,向时钟控制单元申请时钟。PLLs是时钟源,是时钟控制单元的输入。 时钟控制单元有七大主要模块,分别为时钟源控制模块、bank切换模块、分频模块、时钟门控模块、多路选择器模块、寄存器、3G4G时钟握手模块。时钟源控制模块控制时钟源的大小、开关。bank切换模块使时钟控制单元能正常工作在不同的电压下。

时钟控制单元的的工作机理如下:首先,外部模块向时钟控制单元请求时钟,并修改并写寄存器状态;时钟源控制单元根据寄存器中的内容配置时钟源Plls,并提供了所有的时钟源。然后,分频器完成这些时钟源预分频的操作,并将其作为多路选择器的时钟源。而多路选择器则从输入的时钟源中选择输出主时钟。 主时钟通过分频模块产生所有的分频使能信号,这个过程中,需根据寄存器所配置的分频数来输出不同的频率的时钟。同时,根据系统的实时需求,通过由SPCU控制的bank选择器完成门控时钟的实现,降低系统的功耗。

以上是时钟控制模块的功能分析,那么如何通过代码自动生成技术来实现呢? (1)首先,我们把这些模块梳理下,形成一个自顶向下的层次结构,如下图。如图中所示,顶层模块完成对底层模块的连接,底层模块实现时钟控制单元的功能。

15d57d22-33d7-11eb-a64d-12bb97331649.jpg

针对代码自动生成问题,对于顶层模块来说,承担的功能是自动地将底层数十个模块连接起来。对于底层模块来说,需要根据不同的功能定制需求,来自动化地生成所有功能性的代码,然后被顶层调用和连接。这样的话,就存在两个问题:[1]自动生成顶层模块?[2]自动生成底层模块?

(2)顶层模块:通常来说,对于一个复杂的SoC芯片,会有万数量级的信号需要进行匹配和连接。而能够自动生成的信号文件中的信号连接有两个特点:一是信号命令规律性强二是信号的连接关系可以从设计文件中体现。满足了这两点,便可以实现信号文件的自动化。

(3)底层模块此处即可体现Perl脚本强大的数据处理功能,针对该问题,将脚本划分为三类:提取脚本、生成脚本和集成脚本三种。提取脚本用来从输入文件中提取有用的设计信息到存储单元中;生成脚本从存储单元获得有用信息来生成各个功能模块的代码;集成脚本将所有的脚本集成在一个脚本里,方便统一化使用。以下是代码生成的脚本流程图:

15f08298-33d7-11eb-a64d-12bb97331649.jpg

如图所示,输入的文件都是excel和文本形式,Perl脚本首先读取技术文档,从中解析出时钟模块所需的连接、频率、时钟域等信息,基于此信息建立一个数据库。然后,根据实际芯片的具体需求,即配置文件,生成相应的自动化控制模式和需求。 最终,依据配置文件和数据库,完成所有所需verilog代码的生成。需要注意的是,并不是所有的代码都可以自动生成,有些结构特殊的电路,只能通过手工编写来完成。所以,自动编写通常完成较为规整的、有规律性的代码,手工书写作为补充。这样即可保证得到高质量的代码。


责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    30

    文章

    1370

    浏览量

    114148
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73154
  • 硬件电路
    +关注

    关注

    39

    文章

    263

    浏览量

    30144

原文标题:如何写出高质量Verilog HDL代码?这一做法值得推荐

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    一文搞懂 RK3588 PCIe:从硬件资源到拆分配置 + 避坑指南(含脑图)

    与  PHY  对应关系   RK3588  的控制器与  PHY  绑定存在固定规则,拆分配置前需明确对应关系:     • pcie3x4 ( 4Lane ) :仅
    的头像 发表于 11-20 18:18 1890次阅读
    一文搞懂 RK3588 PCIe:从<b class='flag-5'>硬件</b>资源到拆分配置 + 避坑指南(含脑图)

    蜂鸟e203移植要从哪些方面入手,在bsp中哪里修改引脚对应关系,约束文件?

    蜂鸟e203移植要从哪些方面入手,在bsp中哪里修改引脚对应关系,约束文件,跪求大神
    发表于 11-10 07:11

    复杂的软件算法硬件IP核的实现

    代码编译为 HDL 的过程一共分为两步: (1)C to HASM (2)HASM to HDL 第一步 C to HASM 是将 C 语言描述的算法编译为一种中间的、与实际硬件是有一定的对应
    发表于 10-30 07:02

    代码如何重塑硬件设计,AI如何加速创新?

    “  TS Circuit 创始人 Sebe 与 Atopile 创始人 Matt 之间非常有意思的一段对话,讨论了代码如何重塑硬件设计及 AI 如何加速创新。非常值得完整的听一遍,用中文重塑了对话
    的头像 发表于 09-06 11:19 490次阅读

    硬件工程师的 “鄙视链” 新动向:写代码的,凭啥瞧不起画图的?

    “  在海外硬件工程师的世界里,一场关于设计灵魂归属的“圣战”已悄然打响。一边是信奉“所见即所得”、手握鼠标精雕细琢的“画图派”;另一边,则是高举“代码即真理”、用键盘召唤电路的“写码
    的头像 发表于 08-06 11:21 3241次阅读
    <b class='flag-5'>硬件</b>工程师的 “鄙视链” 新动向:写<b class='flag-5'>代码</b>的,凭啥瞧不起画图的?

    CY7C65223-24LTXI的GPIO号和引脚号的对应关系是什么?

    我不知道CY7C65223-24LTXI的GPIO号和引脚号的对应关系。 配置实用程序的 GPIO 配置窗口显示 GPIO_00 到 GPIO_10,但当我查看数据表时,我可以看到 GPIO_2、7
    发表于 05-19 06:31

    跟着华为学硬件电路设计,华为全套硬件电路设计学习资料都在这里了!

    硬件设计,三分经验,七分勤奋,要想要搞硬件设计,不能闭门造车,需要站在巨人的肩膀上才行,要想做好一名硬件工程师,就需学习大牛工程师的电路设计经验,因为这些经验都是从无数的失败开发经历中
    发表于 03-25 13:59

    DLP4710EVM I2C指令中的LED current数值和GUI里的mA数是什么对应关系呢?

    1.能否编写程序,烧录光栅,然后利用SDK里的函数,设置光栅的投射时间,I2C命令是什么呢? 2.I2C指令中的LED current数值和GUI里的mA数是什么对应关系呢?
    发表于 02-26 06:16

    心电输入与ADS1293值的对应关系,如输入1mv时,AD值为多少?

    我想知道心电输入与AD值的对应关系,如输入1mv时,AD值为多少? 按下图的公式,假设输入1mV,Vref=2.4,ADCmax=0x8000,则ADCout = 0x4017。而输入0mV时,ADCout=0x4000。 0x17,基本无法分辨呀。哪里理解错误,谢!
    发表于 02-06 07:40

    如何快速学习硬件电路

    对于想要学习硬件电路的新手来说,一开始可能感到有些困难,但只要掌握了正确的学习方法和技巧,就能够快速地成为一名优秀的硬件电路工程师。 首先,新手需要了解基本的
    的头像 发表于 01-20 11:11 1963次阅读
    如何快速学习<b class='flag-5'>硬件</b><b class='flag-5'>电路</b>

    村田电容标签材质代码如何看?

    字母组合代表了电容的基本类型和用途。例如,GRM表示一般用途片状多层陶瓷电容器。 二、解读尺寸代码 在型号之后,通常会有一串数字或字母数字组合,用以表示电容的尺寸。例如,18、0603等,这些数字或代码对应了电容的长和宽。具体的
    的头像 发表于 01-13 14:14 1431次阅读

    ADS5407对于channel A和B有没有什么对应关系

    每个ADS5407片子,都有2对SYNCOUTP/N管脚 1.对于channel A和B有没有什么对应关系? 2.针对多片ADCs同步应用中,如果每片5407只接一对SYNCOUT到FPGA,能否可行?
    发表于 12-25 07:12

    ADS1271使用不当会不会出现采样率的主时钟不是这个对应关系的情况?

    ADS1271在MODE浮空的情况下采样率Wie主时钟的512分之一,即fs=fclk/512,如果使用不当,会不会出现采样率的主时钟不是这个对应关系的情况,例如当fclk=1024kHz时,理论上fs=2K,但实际上fs=1.2K或者其他,什么情况下会出现这种问题?
    发表于 12-20 08:24

    Verilog 与 ASIC 设计的关系 Verilog 代码优化技巧

    Verilog与ASIC设计的关系 Verilog作为一种硬件描述语言(HDL),在ASIC设计中扮演着至关重要的角色。ASIC(Application Specific Integrated
    的头像 发表于 12-17 09:52 1455次阅读

    BUCK电路占空比与输出电压关系

    BUCK电路是一种常见的降压型直流-直流(DC-DC)变换器,在BUCK电路中,占空比与输出电压之间存在密切的关系。以下是对这种关系的介绍: 一、占空比的定义 在BUCK
    的头像 发表于 12-12 15:45 5255次阅读