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

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

3天内不再提示

如何为FPGA编写可综合的代码?

FPGA之家 来源:AriesOpenFPGA 作者:0Aries0 2021-05-23 14:51 次阅读

一、Verilog 编码风格

(本文的语法高亮因为浏览器的缘故,所以不准确)

1.1 使用“`include编译器指令”

文件包含“`include编译器指令”用于在合成过程中将源文件的全部内容插入到另一个文件中。它通常用于包括全局项目定义,而无需在多个文件中重复相同的代码。另一个用例是将代码的一部分插入模块,如以下示例所示:

// file test_bench_top.v // top-level simulation testbench module test_bench_top; `include “test_case.v” endmodule // file test_case.v initialbegin //… end task my_task; //… endtask

> include编译器指令的语法定义为:`include

可以是文件名,还可以包含绝对或相对路径名:

`include“test_case.v” `include“../../includes/test_case.v” `include“/home/myprojects/test/includes/test_case.v”

建议仅在include中使用文件名,而不要使用绝对或相对路径名。这将使代码位置独立,因此更加可移植。另一个建议是保持包含文件简单而不使用嵌套的include指令。

1.2使用`define编译器指令,parameter和localparam

`define是文本宏替换编译器指令。它定义为:`define

可以包含带有可选参数列表的单行或多行文本。

`define具有全局范围。一旦定义了文本宏名称,就可以在项目中的任何地方使用它。文本宏通常是用于定义状态名称,常量或字符串的简单标识符。

parameter关键字定义模块特定的参数,该参数在特定模块实例的范围生效。参数用于为模块实例提供不同的自定义,例如,输入或输出端口的宽度。以下是使用parameter关键字的示例:

module adder #(parameter WIDTH = 8) ( input[WIDTH-1:0] a,b, output [WIDTH-1:0] sum ); assign sum = a+ b; endmodule // adder // aninstance of adder module adder # (16) adder1 (.a(a[15:0]),.b(b[15:0]),.sum(sum[15:0]));

localparam关键字与parameter相似。它被分配了一个常量表达式,并在特定模块内具有作用域。它定义为:

1.3 使用函数

以下是执行XOR操作的Verilog函数的简单示例:

module function_example( inputa,b, output func_out); functionfunc_xor; inputa, b; begin func_xor = a^ b; end endfunction assign func_out = func_xor(a,b); endmodule // function_example

建议使用Verilog函数来实现组合逻辑和其他不需要非阻塞分配的操作,例如同步逻辑。使用函数可以编写更紧凑和模块化的代码。所有综合工具均支持Verilog函数。

1.4使用 generate块

在Verilog-2001中引入了generate块,以使对同一模块,函数,变量,网络和连续分配的多个实例的实例化变得容易。以下是使用generate的两个示例:

// aconditional instantiation of modules parameter COND1 = 1; generate if(COND1) begin : my_module1_inst my_module1 inst (.clk(clk), .di(di), .do(do)); end elsebegin : my_module2_inst my_module2 inst (.clk(clk), .di(di), .do(do)); end endgenerate // using forloop in generate block genvar ii; generate for(ii = 0; ii < 32; ii = ii+1) begin: for_loop     my_module1 inst (.clk(clk), .di(di[ii]), .do(do[ii]));     end end endgenerate

1.5 开发简单的代码

始终努力开发简单的代码。与每种编程语言一样,Verilog允许编写详细的语句,从功能的角度来看,这些语句很优美,但可读性不高。下面的简单示例说明了这一点:

reg [5:0] sel; reg [3:0] result1,result2,a,b; always @(*) begin result1 = sel[0] ? a + b : sel[1] ? a - b : sel[2] ? a & b : sel[3] ? a ^ b : sel[4] ? ~a : ~ b; if(~|sel) result1 = 4'b0; end// always

reg [5:0] sel; reg [3:0] result1,result2,a,b; always @(*) begin casex(sel) 6'bxxxxx1: result2 = a + b; 6'bxxxx10: result2 = a - b; 6'bxxx100: result2 = a & b; 6'bxx1000: result2 = a ^+ b; 6'bx10000: result2 = ~a; 6'b100000: result2 = ~b; default: result2 = 4'b0; endcase end // always

实现result1和result2的逻辑在功能上是等效的。但是,在result1中使用嵌套三元运算符和两个赋值语句不太透明,并且与result2逻辑的更清晰的case语句相比,需要花更多的精力来理解。

通常,代码清晰度高容易实现高效率。同一段代码能在其生命周期内被多个开发人员读取。编写更清晰的代码更容易调试,并且一般不容易包含错误。

二、为FPGA编写可综合的代码

2.1考虑资源

Verilog语言参考手册(LRM)提供了丰富的功能来描述硬件。但是,只有一部分语言可以为FPGA综和。即使有些特定的语言结构是可综合的,也不能保证该代码能在特定FPGA上实现物理电路。考虑以下示例:

reg [7:0] memory[1:2**22]; initial begin memory[1] = 8’h1; memory[2] = 8’h2; end

该示例能正确模拟出来,但会导致FPGA物理实现失败。该代码需要4 MB的内存,这是一些FPGA所没有的。此外,综合工具将忽略初始块,该块将初始化内存的最低两个字节。

该技巧提供了一些指导方针和建议,以帮助编写用于FPGA的可综合代码。

2.2 遵循同步设计原则

建议开发人员遵守FPGA同步设计的原则,其中包括以下内容:

1、使用同步复位。后续会详细讨论,同步,异步复位的问题

2、避免使用锁存

3、避免使用门控,派生或分频时钟

4、使用时钟使能而不是多个时钟

5、对所有异步信号实行正确同步

原文标题:学习FPGA的小Tips(一)

文章出处:【微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

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

    关注

    1610

    文章

    21390

    浏览量

    595440
  • 代码
    +关注

    关注

    30

    文章

    4596

    浏览量

    67332

原文标题:学习FPGA的小Tips(一)

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FPGA入门必备:Testbench仿真文件编写实例详解

    编写完HDL代码后,往往需要通过仿真软件Modelsim或者Vivadao自带的仿真功能对HDL代码功能进行验证,此时我们需要编写Testbench文件对HDL功能进行测试验证。
    发表于 04-29 10:43 686次阅读

    # FPGA 编程如何工作?

    确定电路中的潜在错误,用户可以在最终编码之前修复这些错误。 VHDL 允许用户编写结构化代码。 高级综合 (HLS) 是用 C 子集完成设计,编译器将代码转换为 Verilog
    发表于 03-30 11:50

    时序电路为什么在FPGA综合成了latch?

    有朋友提问,下面的代码为什么在DC里可以综合成DFF,而在FPGA上却综合成了latch。
    的头像 发表于 02-20 16:12 397次阅读
    时序电路为什么在<b class='flag-5'>FPGA</b>上<b class='flag-5'>综合</b>成了latch?

    如何编写高性能的Rust代码

    为了最大限度地提高Rust应用程序的性能,你需要了解支持代码的底层硬件架构,如何优化算法和数据结构,以及如何对代码进行配置和基准测试。在本文中,我们将简要介绍这些主题,希望能更好地理解如何编写高性能的Rust
    的头像 发表于 11-03 14:28 553次阅读
    如何<b class='flag-5'>编写</b>高性能的Rust<b class='flag-5'>代码</b>

    从可综合的RTL代码的角度聊聊interface

    SystemVerilog引入了interface,这里我们从可综合的RTL代码的角度聊聊interface。
    的头像 发表于 10-12 09:06 1052次阅读
    从可<b class='flag-5'>综合</b>的RTL<b class='flag-5'>代码</b>的角度聊聊interface

    FPGA的约束设计和时序分析

    在进行FPGA的设计时,经常会需要在综合、实现的阶段添加约束,以便能够控制综合、实现过程,使设计满足我们需要的运行速度、引脚位置等要求。通常的做法是设计编写约束文件并导入到
    发表于 09-21 07:45

    AVR1000b:编写用于AVR MCU的C代码入门

    电子发烧友网站提供《AVR1000b:编写用于AVR MCU的C代码入门.pdf》资料免费下载
    发表于 09-19 14:22 2次下载
    AVR1000b:<b class='flag-5'>编写</b>用于AVR MCU的C<b class='flag-5'>代码</b>入门

    将hbirdv2代码综合后下载到FPGA板上报错怎么解决?

    求助: 将hbirdv2代码综合后下载到FPGA板(不是MCU200T或DDR200T)上,由于板子上没有MCU_FLASH,所以引脚绑定时qspi接口悬空,出现如下错误 本人猜测
    发表于 08-16 08:02

    FPGA的Verilog代码编写规范

      注:以R起头的是对编写Verilog代码的IP设计者所做的强制性规定,以G起头的条款是建议采用的规范。每个设计者遵守本规范可锻炼命名规范性。
    的头像 发表于 08-15 16:23 1462次阅读

    labview编写FPGA上位机

    请问各位大佬们,我现在已经使用FPGA编写完了一个串口发送程序,但是需要使用labview来编写一个上位机软件来调用该程序,并且实现串口发送数据的更改,在网上找了好长时间没有找到祥光实例,本人
    发表于 08-07 16:32

    FPGA高级时序综合教程

    FPGA高级时序综合教程
    发表于 08-07 16:07 3次下载

    如何编写Arm汇编代码

    大多数开发人员使用高级语言(如C和C++)编写大部分代码。然后将此高级源代码编译为在目标设备上运行的机器代码。 然而,有时编写低级汇编
    发表于 08-02 13:01

    FPGA设计流程

    FPGA的设计流程主要包括HDL代码编写、RTL综合、布局布线、静态时序分析、生成下载文件。下面将逐一介绍各部分。下面是FPGA设计的流程图
    的头像 发表于 07-04 12:06 1090次阅读
    <b class='flag-5'>FPGA</b>设计流程

    fpga ip核是什么 常用fpga芯片的型号

     FPGA IP核(Intellectual Property core)是指在可编程逻辑器件(Field-Programmable Gate Array,FPGA)中使用的可复用的设计模块或功能片段。它们是预先编写好的硬件设计
    的头像 发表于 07-03 17:13 5776次阅读

    在MicroROS开发板上编写HelloWord代码

    你好,我是爱吃鱼香ROS的小鱼。这一节我们正式在MicroROS开发板上编写代码,输出HelloWorld到电脑上。在正式开始编写代码前,我们先了解下开发流程。
    的头像 发表于 07-02 15:38 768次阅读
    在MicroROS开发板上<b class='flag-5'>编写</b>HelloWord<b class='flag-5'>代码</b>