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

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

3天内不再提示

芯片实现码代码的部分

倩倩 来源:IP与SoC设计 作者:IP与SoC设计 2022-08-23 14:59 次阅读

0 绪论

经过了上篇文章的文档设计,我们这一章开始写代码。码代码这个问题确实是一个必备技能,任何设计不会码代码其实无法实现的。

这块儿流程上包括了两个东西。第一个码代码,第二个是一些必要的代码检查,保证代码不会出现什么歧义导致实现结果和设计意图不一致。具体语法我们就不在这一章讲了,写出来也是千篇一律,此处就简单讲讲HDL的简介,同时讲一下如何提高编码质量,供大家参考。然后简单讲一个代码写完必要的检查工序spyglass检查,这个工具可以避免大部分低级BUG。

521f79dc-21fa-11ed-ba43-dac502259ad0.jpg

1 码代码

52393af2-21fa-11ed-ba43-dac502259ad0.jpg

1.1 HDL简介

此处的代码主要指的是HDL, hardware design language, 最主流的只有一种:Verilog,以及它的衍生品system verilog。其实还有两种语言,VHDL,属于它的时代已经过去了, 还有一种Chisel为代表的高级语言,属于它的时代似乎还没到来。所以我们这个地方重点讲讲verilog。

verilog 1983年被gateway设计,1990年gateway被candance收购。然后90年代出了第一个标准Verilog-95,定义了最原始的语法。直到现在,部分公司还是只允许使用95中的特性。2001年公布新一代标准,verilog-2001, 这一代标准中加入了generate, 多维数组等等实用的语法,现在是verilog使用最主流的标准,基本上所有的软件工具链都支持该标准,后续verilog更新了一代标准verilog2005, 不过这一代标准开始向着一个独立的方向演变,最后被合并到了systemverilog 2009。system verilog中提供了interface等等一系列面向对象的方法,已经广泛被验证支持了,但是在设计实现中只被支持了少部分特性。具体什么特性允许使用其实各个公司都有自己的看法与标准,你需要注意一下公司的编码标准。从我个人的观点来看,如果确认新特性没问题最好用新特性,减少工作量的同时还能避免代码出低级错误。

verilog代码长这样。下面实现了一个十进制的计数器。

524b8824-21fa-11ed-ba43-dac502259ad0.jpg

1.2 编码质量

Verilog其实不是一个很难的语言,但是由于比较落后,编码质量很多需要人为来注意。编码质量主要就是两个方面考虑。容易出错的点以及提高后续步骤效率的点。常见容易出错的点大家应该都懂,此处简单总结了一下我觉得需要了解又容易被忽略的点,欢迎大家补充。

1.2.1 容易出错的点

·命名有意义,代码有注释。这个任何编程语言都需要注意,我把它列在第一点,这是一个码农最起码的素质。即可以避免自己出错,又可以避免接手代码的人一头雾水。我也看过不少代码没注释,命名还全是tmp1 tmp2 tmp3, 最后结局只能是自己重写。

·信号不要以Reg以及数字结尾。这个点很容易被忽略,综合时会自动给信号加上reg, 到时候就没办法区分是你写的,还是自动生成的,非要标识这是个寄存器可以用ff结尾。同时,如果多组信号不要命名为xx1,xx2, 这么做非常容易和xx[1]混淆,建议改成xxa, xxb。

·敏感列表用*,不要用具体的信号。always实现组合逻辑的时候一个敏感列表always @(列表),这个列表直接用*,让综合去自动填敏感列表,把信号写进去非常容易出错。

·少用magic numer。设计的时候好多时候需要用到参数,比如fifo的深度,这种东西尽量用参数表示出来,不同地方引用一个参数,否则非常容易出现不一致的情况。

·不要生产latch。latch指的是没有锁存的寄存,生成latch会产生毛刺,所以非必要不允许使用latch。之所以产生latch其原理是你实现了组合逻辑,但是某个周期某个变量值没有发生变化。所以牢记规律,时序逻辑值可以不变,但组合逻辑必须每个周期都赋值。具体点讲,实现组合逻的时候,case必须有default, if必须有else。

·不要生产组合逻辑环。组合逻辑环指的是同周期A变化的条件是B,而B变化依赖于A。相当于软件中的死循环。功能上就不可能正确,所以设计的时候要记得避免组合逻辑环。

·异步信号不要直接打拍。异步信号需要特别注意。在详设的时候应该就要考虑清楚怎么处理。是用多级打拍,DMUX,异步FIFO等等办法,总之,不能当做同步信号给直接处理了,否则必出错。

1.2.2 提高后续效率需要注意的点

·尽量一个模块用一个时钟域。主要是为了后端设计起来比较方便,CTS步骤(见后续文章)较容易。

·大的模块最好reg in和reg out。可以最大程度上避免后端时序上出问题。因为后端模块与模块之间不一定是按着放的,寄存器输出寄存器输入留出足够的时间余量。

·不可综合的与可综合的代码分模块。设计代码的时候有时候可能会用到SRAM cell, 或者其他硬核IP,再或者designware IP。这些东西最好单独封装模块调用。主要是为了后续代码可能会用FPGA或者emulation验证,不可综合的部件直接替换成逻辑版本。

码代码部分内容大致就是这些。其实也不必压力太大,因为代码写出来是要经过多轮工具检查的。尤其经过下面讲的spyglass检查后,想出错也没有那么容易(当然,一旦出错就是非常隐蔽的错误,可能流片后都没发现Orz)

2 Spyglass检查

码完代码,其实我们有一个非常强力的工具可以避免大部分低级错误。这个工具应该是synopsys公司出的。这个工具的GUI长这样。

5275db92-21fa-11ed-ba43-dac502259ad0.jpg

最主要检查的东西应该有两个,lint检查一些常用的语法错误,CDC (Clock Domain Crossing )检查异步的处理是不是有问题。

5287e8d2-21fa-11ed-ba43-dac502259ad0.jpg

lint会检查出所有等号左右位宽不匹配、组合逻辑环、生成了latch, 端口连接不对等等问题。基本上常见的错误都会报出来,一般它会采用宁可错杀不会放过的策略。所以此处会爆出一大堆的错误,需要逐个check一下有没有问题。当然,好多问题也是可以waive掉的,但必须每个waive都要十分确定能不能waive掉。比如计数器,一般计数器到溢出就自动回环了,这种时候lint就会爆出错,你就要检查一下是不是真的要让计数器回环。一般spygalss给你报的错分为四类,fatel, error, warning, info。其中fatel和error是一定不能有的, 有了必然不让你拿去流片,warning可以适当waive,info大多不用管。

CDC会检查异步问题。主要检查是不是所有跨时钟域的信号经过了同步,如果spyglass没检查到跨时钟域的信号没有经过多级打拍或者dmux同步会报错。再比如A时钟域的两个信号同步到了B时钟域,然后合并了,这个时候也会报错,因为这两个信号同步过去以后时序可能会发生变化,要仔细检查。再比如要同步的信号不是寄存器输出的,这种情况由于存在毛刺风险,会增大亚稳态的概率,所以也会报出来。总之, 你能想到的错误基本上都会检查出来。

本部分主要简单介绍了编码完后要用到的最重要的工具之一spyglass。实际使用的时候确实也要有一定的经验积累,什么问题可以waive掉,什么问题必须改。没必要所有问题都改掉,耗费的精力实在是太大,但真的存在风险的问题必须改掉,否则就可能搞出大事儿。。。

3 总结

本节我们讲了芯片实现码代码的部分。主要就是verilog以及后续的检查。芯片流片是一锤子买卖,所以一定要保证写的代码不出错,一方面,在本节讲的编码阶段要尽量少写bug, 另一方面,要经过缜密的验证,最大程度上拦截BUG。

审核编辑 :李倩

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

    关注

    453

    文章

    50304

    浏览量

    421434
  • vhdl
    +关注

    关注

    30

    文章

    816

    浏览量

    128059
  • 代码
    +关注

    关注

    30

    文章

    4733

    浏览量

    68296

原文标题:一颗芯片的前世今生:设计(前端之编码)

文章出处:【微信号:IP与SoC设计,微信公众号:IP与SoC设计】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ASCII在编程中的应用实例

    ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)在编程中有着广泛的应用。以下是一些ASCII在编程中
    的头像 发表于 11-10 09:43 212次阅读

    如何使用ASCII进行编码

    ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是一种字符编码标准,用于文本电子交换。它主要包括128个字符
    的头像 发表于 11-10 09:37 207次阅读

    AIC3254的miniDSP编写代码和编写C5502代码有什么区别?

    问题:AIC3254的miniDSP编写代码和编写C5502代码有什么区别,执行速度和代码量来进行分析吧,谢谢回复
    发表于 11-06 07:22

    基于图遍历的Flink任务画布模式下零代码开发实现方案

    的过程。以下是利用Flink的 StreamGraph 通过低代码的方式,来实现StreamGraph的生成,并最终实现 Flink 程序零代码开发的解决方案。 一、Flink 相关
    的头像 发表于 11-05 10:35 550次阅读
    基于图遍历的Flink任务画布模式下零<b class='flag-5'>代码</b>开发<b class='flag-5'>实现</b>方案

    使用实现CC3220空中升级

    电子发烧友网站提供《使用实现CC3220空中升级.pdf》资料免费下载
    发表于 09-29 10:21 0次下载
    使用<b class='flag-5'>码</b>云<b class='flag-5'>实现</b>CC3220空中升级

    STM32转AT32代码转换

    GD32等等。本文主要介绍一款ST32转AT32的工具AT32SmartCodeTransfer.exe,可以快速实现芯片的更换,提高开发效率。1.1.软件功能本软
    的头像 发表于 09-28 08:09 259次阅读
    STM32转AT32<b class='flag-5'>代码</b>转换

    二维扫描头设备嵌入到闸机上,实现扫手机屏幕完成签到签退

    如何嵌入到闸机上,实现扫手机屏幕完成签到签退的过程及其优势。一、二维扫描头设备的嵌入技术二维扫描头设备作为一种高效的信息采集工具,其核心技术在于快速、准确地读取并
    的头像 发表于 09-18 15:45 215次阅读
    二维<b class='flag-5'>码</b>扫描头设备嵌入到闸机上,<b class='flag-5'>实现</b>扫手机屏幕<b class='flag-5'>码</b>完成签到签退

    hex文件如何查看原c语言代码

    直接将 .hex 文件转换回原始的 C 语言代码是不可能的,因为 .hex 文件是二进制文件,它包含了单片机程序编译后的机器,这些机器与原始的 C 语言代码在结构和表达上存在巨大的
    的头像 发表于 09-02 10:37 1354次阅读

    LKT(LCS)代码移植芯片优势

    所谓代码移植就是客户可以把自定义的程序一部分关键代码函数移植到加密芯片中运行。用户采用标准C语言编写代码,通过KEIL C编译器,编译并下载
    的头像 发表于 08-22 10:03 627次阅读

    百度发布智能代码助手“文心快

    在近日举办的WAVE SUMMIT大会上,百度公司震撼发布了全新的智能代码助手——“文心快”。这款基于百度文心大模型的强大工具,结合了海量的编程数据,旨在为开发者提供一站式的代码智能生成、修改和优化服务。
    的头像 发表于 07-01 11:20 824次阅读

    阿里云内部全面推行AI写代码

    阿里云正在内部全面推行 AI 编程,使用通义灵辅助程序员写代码、读代码、查 BUG、优化代码等。
    的头像 发表于 04-07 09:22 519次阅读

    在CCG5代码中怎么实现DR_SWAP?

    请教个问题,在 CCG5代码中怎么实现DR_SWAP?我们配置了端口 0 作为源对外充电,但是我们希望 PORT0 做了 UFP。我们是这样写的代码:案例 APP_EVT_PD_合同谈判_完成
    发表于 02-26 06:27

    sim卡pin怎么设置 pin和puk有什么区别

    SIM卡(Subscriber Identity Module)是一种存储用户身份信息的芯片,用于在移动通信网络中识别用户,并且可以存储一些联系人信息和短信等。为了保护用户的个人信息安全,SIM卡
    的头像 发表于 02-19 16:20 4241次阅读

    modbus协议功能分类 modbus协议功能是什么,有什么作用

    Modbus协议是一种用于工业领域常见的通信协议,它基于主从结构,用于在不同设备之间实现数据交换。Modbus协议的功能是决定数据交换类型和操作的重要部分。下面将详细介绍Modbus协议功能
    的头像 发表于 01-31 14:47 6408次阅读

    基于相机技术的工业级多器——DC200读

    作为一款基于相机技术的工业级多器,IDC200读器可以识别各种传统的一维和二维,包括各种材料上的印刷条码、点针打标
    的头像 发表于 01-26 14:34 882次阅读
    基于相机技术的工业级多<b class='flag-5'>码</b>读<b class='flag-5'>码</b>器——DC200读<b class='flag-5'>码</b>器