FPGA Verilog HDL 综合和仿真说明

1. 综合和仿真

1.1 综合

Verilog 是硬件描述语言,顾名思义,就是用代码的形式描述硬件的功能,最终在硬件电路上实现该功能。在 Verilog 描述出硬件功能后需要使用综合器对 Verilog 代码进行解释并将代码转化成实际的电路来表示,最终产生实际的电路,也被称为网表。这种将 Verilog 代码转成网表的工具就是综合器。如vivado等 FPGA 开发工具都是综合器。

例:实现加法器的功能

//实现加法器功能Verilog代码
module m_adder(
	a,
	b,
	c
	);
	//......
	always @(*) begin
		c = a + b;
	end
endmodule

在这里插入图片描述
如上图所示,一个加法器的功能Verilog 代码经过综合器解释后该代码被转化成一个加法器电路。

1.2 仿真

  • 在 FPGA 设计的过程中,不可避免会出现各种 BUG。如果在编写好代码、综合成电路、烧写到FPGA 后才发现问题,此时再去定位问题就会非常地困难。而在综合前,设计师可以在电脑里通过仿真软件如Modelsim等对代码进行仿真测试,检测出 BUG 并将其解决,最后再将程序烧写进 FPGA。
  • 为了模拟真实的情况,需要编写测试文件testbench。该文件也是用 Verilog 编写的,其描述了仿真对象的输入激励情况。该激励力求模仿最真实的情况,产生最接近的激励信号,将该信号的波形输入给仿真对象,查看仿真对象的输出是否与预期一致。需要注意的是:在仿真过程中没有将代码转成电路,仿真器只是对代码进行仿真验证。至于该代码是否可转成电路,仿真器并不关心。
  • 由此可见,Verilog 的代码不仅可以描述电路,还可以用于测试。事实上,Verilog 定义的语法非常之多,但绝大部分都是为了仿真测试来使用的,只有少部分才是用于电路设计。

例:加法器的仿真

//加法器testbench测试文件代码
module testbench();
	wire[2:0] t_a,t_b,t_c;
	//.......
	m_adder uut(.a(t_a),.b(t_b),.c(t_c));

	initial begin
		t_a = 0;
		t_b = 0;
		#10;
		t_a = 1;
		t_b = 2;
		#10;
		t_b = 1;
	end
endmodule

在这里插入图片描述

2. 可综合设计

  • Verilog 描述硬件电路,其建立在硬件电路的基础之上。而有些语法结构只是以仿真测试为目的,是不能与实际硬件电路对应起来的。也就是说在使用这些语法时,将一个语言描述的程序映射成实际硬件电路中的结构是不能实现的,也称为不可综合语法
  • 综合就是把编写的 rtl 代码转换成对应的实际电路。 比如编写代码 assign a=b&c;EDA 综合工具就会去元件库里调用一个二输入与门,将输入端分别接上 b 和 c,输出端接上 a。因此,“综合”要做的事情有:编译 rtl 代码,从库里选择用到的门器件,把这些器件按照“逻辑”搭建成“门”电路。
  • 不可综合,是指找不到对应的“门”器件来实现相应的代码。 比如“#100”之类的延时功能,简单的门器件是无法实现延时 100 个单元的,还有打印语句等,也是门器件无法实现的。因此在设计的时候要确保所写的代码是可以综合的。

2.1 不可综合或不推荐使用代码

代码要求
initial严禁在设计中使用,只能在测试文件中使用。
task/function不推荐在设计中使用,在测试文件中可用。
for在设计中、测试文件中均可以使用。但在设计中多数会将其用错,所以建议在初期设计时不使用,熟练后按规范使用。
while/repeat/forever严禁在设计中使用,只能在测试文件中使用。
integer不推荐在设计中使用。
三态门内部模块不能有三态接口,三态门只有顶层文件才使用。三态门目的是为了节省管脚,FPGA 内部完全没有必要使用。
casex/casez设计代码内部不能有 X 态和 Z 态,因此 casez、casex 设计时不使用。
force/wait/fork严禁在设计中使用,只能在测试文件中使用。
#n严禁在设计中使用,只能在测试文件中使用。

2.2 推荐使用代码

代码备注
reg/wire设计中所有的信号类型定义,只有 reg 和 wire 两种。
parameter设计代码中所有的位宽、长度、状态机命名等,建议都用参数表示,阅读方便并且修改容易。
assign/always程序块主要部分,组合逻辑可用assign或always@(*)。时序逻辑用always@(posedge clk or negedgerst_n),时序逻辑中,敏感列表一定是 clk的上升沿和复位的下降沿、最开始必须判断复位。
if else 和 casealways 里面的语句,使用 if else 和 case 两种方法用来作选择判断,理论上可以完成全部设计。
算术运算符(+,-,×,/,%)可以直接综合出相对应的电路。但除法和求余运算的电路面积一般比较大,不建议直接使用除法和求余。
赋值运算符(=,<=)时序逻辑用“<=”,组合逻辑用“=”;其他情况不存在。
关系运算符(==,!=,>,<,>=,<=,)
逻辑运算符(&&,II,!)
位运算符(~,I,^,&)
移 位 运 算 符 ( <<,>>)
拼接运算符({ })
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zz小叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值