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

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

3天内不再提示

FPGA设计关于Verilog编码的12规范

454398 来源:FPGA技术联盟 作者:FPGA技术联盟 2020-11-24 12:12 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1、命名规则

① 首先每个文件只包含一个module,而且module名要小写,并且与文件名保持一致;

② 除parameter外,信号名全部小写,名字中的两个词之间用下划线连接,如receive_clk_b;

③ 由parameter定义的常量要求全部字母大写,自己定义的参数、类型用大写标识,推荐使用parameter来定义有实际意义的常数,包括单位延时、版本号、板类型、单板在位信息、LED亮灯状态、电源状态、电扇状态等;

④ 信号名长度不超过20字符,并且避免使用Verilog和VHDL保留字命令,建议给信号名添加有意义的前缀或后缀,命名符合常用命名规范(如_clk 或clk_表示时钟, n表示低电平有效, z表示三态信号, en表示使能控制,rst 表示复位);

⑤ 保持缩写意义在模块中的一致性,同一信号在不同层次应该保持一致性。

2、注释规则

① 每个文件有一个文件头,文件头中注明文件名、功能描述、引用模块、设计者、设计时间、版权信息以及修改信息等;

② 对信号、参量、引脚、模块、函数及进程等加以说明,便于阅读与维护,如信号的作用、频率、占空比、高低电平宽度等。用“//”做小于1行的注释,用“/* */”做多于1行的注释。更新的内容要做注释,记录修改原因,修改日期和修改人。

3、模块规则

① module例化名用u_xx_x标示;

② 建议给每个模块要加timescale;

③ 不要书写空的模块,即:一个模块至少要有一个输入和一个输出;

④ 为了保持代码的清晰、美观和层次感,一条语句应占用一行,每行限制在80个字符以内,如果较长(超出80个字符)则换行;

⑤ 采用基于名字(name_based)的调用而不是基于顺序的(order_based)的调用;

⑥ 模块的接口信号按输入、双向、输出顺序定义;

⑦ 使用降序定义向量有效位顺序,最低位为0;

⑧ 管脚和信号说明部分:一个管脚和一组总线占用一行,说明要清晰;

⑨ 不要采用向量的方式定义一组时钟信号;

⑩ 逻辑内部不对input进行驱动,在module内不存在没有驱动源的信号,更不能在模块端口存在没有驱动的输出信号,避免在elabarate和compile时产生warning;

⑪ 在顶层模块中,除了内部的互连和module的例化外,避免在做其他逻辑;

⑫ 出于层次设计和同步设计的考虑,子模块输出信号建议用寄存器

⑬ 内部模块端口避免inout,最好在最顶层模块处理双向总线;

⑭ 子模块中禁止使用三态逻辑,可以在顶层模块使用;

⑮ 如果能确保该信号不会被其它子模块使用,而是直接通过顶层模块输出I/O口,可以在子模块中使用三态;

⑯ 禁止出现未连接的端口;

⑰ 为逻辑升级保留的无用端口和信号要注释;对于层次化设计的逻辑,在升级中采用增量编译;建议采用层次化设计,模块之间相对独立。

4、线网和寄存规则

① 锁存器和触发器不允许在不同的always块中赋值,造成多重驱动;

② 出于功能仿真考虑,非阻塞赋值应该增加单位延时,对于寄存器类型的变量赋值时,尤其要注意这一点;阻塞赋值不允许使用单位延时;

③ always语句实现时序逻辑采用非阻塞赋值;always语句实现的组合逻辑和assign语句块中使用阻塞赋值;

④ 同一信号赋值不能同时使用阻塞和非阻塞两种方式;

⑤ 不允许出现定义了parameter、wire、reg却没有使用的情况;

⑥ 不建议使用integer类型寄存器;

⑦ 寄存器类型的信号要初始化;

⑧ 除移位寄存器外,每个always语句只对一个变量赋值,尽量避免在一个always语句出现多个变量进行运算或赋值。

5、表达式规则

① 在表达式内使用括号表示运算的优先级,一行中不能出现多个表达式;

② 不要给信号赋“x”态,以免x值传递;

③ 设计中使用到的0,1,z等常数采用基数表示法书写(即表示为1'b0,1'b1,1'bz或十六进制);

④ 端口申明、比较、赋值等操作时,数据位宽要匹配。

6、条件语句规则

① if 都有else和它对应,变量在if-else或case语句中所有变量在所有分支中都赋值;

② 如果用到case语句,记得default项;

③ 禁止使用casex,case语句item必须使用常数;

④ 不允许使用常数作为if语句的条件表达式;

⑤ 条件表达式必须是1bit value;

⑥ 如异步复位:

高电平有效使用“if(asynch_reset==1'b1)”,

低电平“if(asynch_reset==1'b0)”,

不要写成:

“if(!asynch_reset)”或者“if(asynch_reset==0)”;

⑦ 不推荐嵌套使用5级以上if…else if…结构。

7、可综合部分规则

① 不要使用include语句;

② 不要使用disable、initial等综合工具不支持的电路,而应采用复位方式进行初时化,但在testbench电路中可以使用;

③ 不使用specify模块,不使用===、!==等不可综合的操作符;

④ 除仿真外,不使用fork-join语句;

⑤ 除仿真外,不使用while语句;

⑥ 除仿真外,不使用repeat语句;

⑦ 除仿真外,不使用forever语句;

⑧ 除仿真外,不使用系统任务($);

⑨ 除仿真外,不使用deassign语句;

⑩ 除仿真外,不使用force,release语句;

⑪ 除仿真外,不使用named events语句;不在连续赋值语句中引入驱动强度和延时;

⑫ 禁止使用trireg型线网;

⑬ 制止使用tri1、tri0、triand和trior型的连接;

⑭ 不要位驱动supply0和supply1型的线网赋值;

⑮ 设计中不使用macro_module;

⑯ 不要在RTL代码中实例门级单元尤,其下列单元:(CMOS/RCOMS/NMOS/PMOS/RNMOS/RPMOS/trans/rtrans/tranif0/tranif1/rtranif0/tranif1/pull_gate)。

8、可重用的部分规则

① 考虑未使用的输入信号power_down,避免传入不稳定态;

② 接口信号尽量少,接口时序尽量简单;

③ 将状态机(FSM)电路与其它电路分开,便于综合和后端约束;

④ 将异步电路和同步电路区分开,便于综合和后端约束,将相关的逻辑放在一个模块内;

⑤ 合理划分设计的功能模块,保证模块功能的独立性;

⑥ 合理划分模块的大小,避免模块过大;

⑦ 在设计的顶层(top)模块,将I/O口、Boundary scan电路、以及设计逻辑(corelogic)区分开。

9、同步设计规则

① 同一个module中,要在时钟信号的同一个沿动作;

② 如果必须使用时钟上升沿和时钟下降沿,则要分两个module设计;

③ 在顶层模块中,时钟信号必须可见,不在模块内部生成时钟信号,而要使用DCM/PLL产生的时钟信号;

④ 避免使用门控时钟和门控复位;

⑤ 同步复位电路,建议在同一时钟域使用单一的全局同步复位电路;
异步复位电路,建议使用单一的全局异步复位电路;

⑥ 不在时钟路径上添加任何buffer;

⑦ 不在复位路径上添加任何buffer;

⑧ 避免使用latch;

⑨ 寄存器的异步复位和异步置位信号不能同时有效;

⑩ 避免使用组合反馈电路;

⑪always有且仅有一个的敏感事件列表,敏感事件列表要完整,否则可能会造成前后仿真的结果不一致;

⑫ 异步复位情况下需要异步复位信号和时钟沿做敏感量,同步复位情况下只需要时钟沿做敏感量;

⑬ 时钟事件的表达式要用:

“negedge

“posedge”的形式;

⑭ 复杂电路将组合逻辑和时序逻辑电路分成独立的always描述。

10、循环语句规则

① 在设计中不推荐使用循环语句;

② 在非常有必要使用的循环语句时,可以使用for语句。

11、约束规则

① 对所有时钟频率和占空比都进行约束;

② 对全局时钟skew进行约束;

③ 对于时序要求的路径需要针对特殊要求进行约束,如锁相环鉴相信号;

④ 要根据输出管脚驱动要求进行约束,包括驱动电流和信号边沿特性;

⑤ 要根据输入和输出信号的特性进行管脚上下拉约束;

⑥ 针对关键I/O是否约束了输入信号和输入时钟的相位关系,控制输入信号在CLK信号之后或之前多少ns到达输入pad;

⑦ 综合设置时,fanout建议设置为3030;

⑧ 要使用输入输出模块中的寄存器,如Xinlinx公司的IOB,map properties选项pack I/O register/latches into IOBsactor需要设置成为“for input and output”,这样可以控制管脚到内部触发器的延时时间;

⑨ 布局布线报告中IOB、LUTs、RAM等资源利用率应小于百分之八十;

⑩ 对于逻辑芯片对外输入接口,进行tsu/th约束;对于逻辑芯片对外输出接口,进行约束。

12、PLL/DCM规则

① 如果使用FPGA内部DCM和PLL时,应该保证输入时钟的抖动小于300ps,防止DCM/PLL失锁;如果输入时钟瞬断后必须复位PLL/DCM。

② 对于所有厂家的FPGA,其片内锁相环只能使用同频率的时钟信号进行锁相,如果特殊情况下需要使用不同频率的信号进行锁相,需要得到厂家的认可,以避免出时钟。

13、代码编辑规则

① 由于不同编辑器处理不同,对齐代码使用空格,而不是tab键。

编辑:hfy

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

    关注

    30

    文章

    1370

    浏览量

    114140
  • 锁存器
    +关注

    关注

    8

    文章

    952

    浏览量

    43846
  • 触发器
    +关注

    关注

    14

    文章

    2051

    浏览量

    63043
  • 编辑器
    +关注

    关注

    1

    文章

    826

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何使用FPGA实现SRIO通信协议

    本例程详细介绍了如何在FPGA上实现Serial RapidIO(SRIO)通信协议,并通过Verilog语言进行编程设计。SRIO作为一种高速、低延迟的串行互连技术,在高性能计算和嵌入式系统中广
    的头像 发表于 11-12 14:38 4981次阅读
    如何使用<b class='flag-5'>FPGA</b>实现SRIO通信协议

    如何利用Verilog HDL在FPGA上实现SRAM的读写测试

    本篇将详细介绍如何利用Verilog HDL在FPGA上实现SRAM的读写测试。SRAM是一种非易失性存储器,具有高速读取和写入的特点。在FPGA中实现SRAM读写测试,包括设计SRAM接口模块
    的头像 发表于 10-22 17:21 3958次阅读
    如何利用<b class='flag-5'>Verilog</b> HDL在<b class='flag-5'>FPGA</b>上实现SRAM的读写测试

    基于FPGA开发板TSP的串口通信设计

    本文详细介绍基于Terasic FPGA开发板TSP(又名C5P和OSK)和其板载CP2102N USB-UART桥接芯片的串口通信系统设计与实现。系统采用Verilog HDL编写UART收发控制器,通过CP2102N实现FPGA
    的头像 发表于 10-15 11:05 4151次阅读
    基于<b class='flag-5'>FPGA</b>开发板TSP的串口通信设计

    M12航空插头引脚功能:从编码差异看连接逻辑

    选择德索的三大理由:12编码全覆盖,支持免费样品测试;100+工程师48小时出接线方案;所有插头通过CE认证,7天无理由退换。做这行久了明白,客户要的不是复杂参数,而是“拿来就能用”的放心。德索把编码逻辑做简单了,连接自然就可
    的头像 发表于 07-31 17:40 585次阅读
    M<b class='flag-5'>12</b>航空插头引脚功能:从<b class='flag-5'>编码</b>差异看连接逻辑

    RTL级机器人电机控制器的FPGA设计

    借助Verilog,在FPGA中实现了带编码器的两台电机的电机控制系统的RTL级设计。
    的头像 发表于 07-07 14:01 2535次阅读
    RTL级机器人电机控制器的<b class='flag-5'>FPGA</b>设计

    fpga做电机控制有前途吗?还是?

    咱今儿个唠唠 FPGA 做电机控制这事儿,先把丑话说在前头 —— 要是有人开口就提某品牌伺服驱动器还在用 FPGA 跑电流环,咱可得把话掰扯清楚。咱自己实打实拿 Verilog 写过 CORDIC
    的头像 发表于 05-29 15:08 1417次阅读
    用<b class='flag-5'>fpga</b>做电机控制有前途吗?还是?

    FPGA Verilog HDL语法之编译预处理

    Verilog HDL语言和C语言一样也提供了编译预处理的功能。“编译预处理”是Verilog HDL编译系统的一个组成部分。Verilog HDL语言允许在程序中使用几种特殊的命令(它们不是一般
    的头像 发表于 03-27 13:30 1088次阅读
    <b class='flag-5'>FPGA</b> <b class='flag-5'>Verilog</b> HDL语法之编译预处理

    一文详解Verilog HDL

    Verilog HDL(Hardware Description Language)是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。现实生活中多用于专用集成电路
    的头像 发表于 03-17 15:17 3780次阅读
    一文详解<b class='flag-5'>Verilog</b> HDL

    数字集成电路 Verilog 熟悉vivado FPGA微电子、电子工程

    1、计算机、微电子、电子工程等相关专业硕士; 2、熟悉数字集成电路基本原理、设计技巧、设计流程及相关EDA工具; 3、精通Verilog语言,熟悉AMBA协议; 4、有FPGA开发或SOC设计经验优先; 5、具有较强的独立工作能力、良好的团队合作精神。
    发表于 02-11 18:03

    请教ADC12D1800RFRBEVM板问题

    关于 ADC12D1800RFRBEVM板的问题,这个板子上有AD和 FPGA(是4系列的),我们只是想用你们的AD用7系列的FPGA进行处理,因为你们板上的4系列
    发表于 01-21 07:43

    Verilog例化说明

    Verilog例化说明 1.什么是模块例化?为什么要例化? 模块例化可以理解成模块调用。对于一个FPGA工程,通常是由一个顶层模块与多个功能子模块组成,为了实现顶层模块与子模块的连接,需要进行模块间
    的头像 发表于 12-17 11:29 3126次阅读
    <b class='flag-5'>Verilog</b>例化说明

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

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

    Verilog 测试平台设计方法 Verilog FPGA开发指南

    Verilog测试平台设计方法是Verilog FPGA开发中的重要环节,它用于验证Verilog设计的正确性和性能。以下是一个详细的Verilog
    的头像 发表于 12-17 09:50 1560次阅读

    Verilog与VHDL的比较 Verilog HDL编程技巧

    Verilog 与 VHDL 比较 1. 语法和风格 VerilogVerilog 的语法更接近于 C 语言,对于有 C 语言背景的工程师来说,学习曲线较平缓。它支持结构化编程,代码更直观,易于
    的头像 发表于 12-17 09:44 2691次阅读

    FPGA打砖块小游戏设计思路

      交流问题   Q :FPGA打砖块小游戏,如何基于FPGAverilog语言在Vivado平台上写打砖块小游戏,最好能用到PS2与VGA。 A :以下是一个基于 FPGA 
    的头像 发表于 12-09 16:57 1462次阅读