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

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

3天内不再提示

Verilog编码风格

FPGA之家 来源:FPGA之家 作者:FPGA之家 2022-06-26 10:46 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、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
    +关注

    关注

    1656

    文章

    22288

    浏览量

    630386
  • Verilog
    +关注

    关注

    30

    文章

    1370

    浏览量

    114153

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用NucleiStudio生成tb仿真需要的.verilog文件

    打开仿真顶层文件tb_top.v,存放在ITCM模块里面的指令是通过readmemh函数读入.verilog文件实现的: 下面通过对NucleiStudio IDE进行设置,实现将c
    发表于 11-05 07:07

    verilog模块的调用、任务和函数

    在做模块划分时,通常会出现这种情形,某个大的模块中包含了一个或多个功能子模块,verilog是通过模块调用或称为模块实例化的方式来实现这些子模块与高层模块的连接的.
    的头像 发表于 05-03 10:29 1292次阅读
    <b class='flag-5'>verilog</b>模块的调用、任务和函数

    FPGA Verilog HDL语法之编译预处理

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

    优先编码器:高效数据选择与编码的解决方案

    在现代数字电路设计中,数据的选择与编码是不可或缺的重要环节。面对众多输入信号,如何高效地选择并编码所需数据,成为设计师们面临的一大挑战。优先编码器,作为一种独特的数字电路组件,凭借其高效、灵活的特点
    的头像 发表于 03-25 08:33 863次阅读

    一文详解Verilog HDL

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

    伺服电机编码器怎么选型

    伺服电机编码器的选型是一个综合性的过程,需要考虑多个因素以确保所选编码器能够满足系统的性能要求。以下是一些关键的选型步骤和考虑因素: 一、明确应用需求 首先,需要明确伺服电机编码器的应用需求,包括
    的头像 发表于 03-11 12:01 1474次阅读
    伺服电机<b class='flag-5'>编码</b>器怎么选型

    Verilog中signed和$signed()的用法

    1、在verilog中有时会用signed修饰符来修饰定义的数据,运算的时候也会用$signed()任务来强制转换数据,那么signed的修饰是为什么呢,是为了区分有符号数和无符号数的加法和乘法
    的头像 发表于 02-17 17:47 1191次阅读
    <b class='flag-5'>Verilog</b>中signed和$signed()的用法

    浅谈Verilog和VHDL的区别

    Verilog和VHDL是两种广泛使用的硬件描述语言(HDL),它们用于描述和模拟数字电路系统的行为和结构。这两种语言的主要作用是帮助工程师设计、仿真和验证集成电路(IC)和系统级芯片(SoC)中的硬件模块。
    的头像 发表于 02-17 14:20 2644次阅读
    浅谈<b class='flag-5'>Verilog</b>和VHDL的区别

    信道编码和信源编码的区别

    信道编码和信源编码是数字通信系统中两个至关重要的环节,它们各自承担着不同的功能和角色。
    的头像 发表于 01-29 16:29 2901次阅读

    bcd编码的优缺点 bcd编码的常见错误

    BCD(Binary-Coded Decimal)编码是一种二进制编码方式,用于将十进制数(0-9)直接转换为二进制形式。这种编码方式在数字系统中非常常见,尤其是在需要处理数字数据的硬件和软件中
    的头像 发表于 12-20 17:17 2392次阅读

    Verilog 电路仿真常见问题 Verilog 在芯片设计中的应用

    在现代电子设计自动化(EDA)领域,Verilog作为一种硬件描述语言,已经成为数字电路设计和验证的标准工具。它允许设计师以高级抽象的方式定义电路的行为和结构,从而简化了从概念到硅片的整个设计流程
    的头像 发表于 12-17 09:53 1613次阅读

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

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

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

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

    如何使用 Verilog 进行数字电路设计

    使用Verilog进行数字电路设计是一个复杂但有序的过程,它涉及从概念设计到实现、验证和优化的多个阶段。以下是一个基本的步骤指南,帮助你理解如何使用Verilog来设计数字电路: 1. 明确设计需求
    的头像 发表于 12-17 09:47 1759次阅读

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

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