1.4.1 硬件原则
FPGA设计采用的主要编程语言包括VHDL、Verilog和SystemVerilog,三者均属于硬件描述语言(Hardware Description Language,HDL),其中,SystemVerilog因其在验证方面显示的强大功能又被称为硬件描述与验证语言(Hardware Description and Verification Language,HDVL)。硬件描述语言,顾名思义,其描述的对象是硬件电路,是实实在在存在的硬件电路,这要求我们必须采用HDL可综合的部分进行电路设计,遵循可综合的代码规范。设计者需要了解所用的HDL哪些是可综合的,哪些是不可综合的。例如,延迟语句,无论是VHDL中的wait for语句,还是Verilog或SystemVerilog中的“#延迟时间”(延迟时间为具体数字),均是不可综合的。同样,除法运算“/”也是不可综合的(只有当除数为2的整数次幂时才可综合,此时等效于右移操作)。从数据类型的角度而言,实数(Real)是不可综合的。
相比软件编程语言(如C/C++),HDL具有两大特征:并发性和时序性。并发性体现在同一模块中的不同进程(VHDL中的process,Verilog中的always,SystemVerilog中的always_ff、always_comb和always_latch)是同时执行的,这反映了硬件电路的特征:一旦上电,同时工作。时序性则体现了不同数据路径在时钟作用下的相互关系及时序路径与控制路径的关系。时序是设计出来的,不是凑出来的,更不是测出来的。就这点而言,在开始编程之前,要有待设计电路的基本雏形。例如,要设计一个复数乘法器,就要先画出如图1-36所示的硬件电路,图中,D表示D触发器,第一个复数的实部和虚部分别为ar和ai,第二个复数的实部和虚部分别为br和bi。从图1-36中也可以看出各数据路径之间的时序关系。“先有电路,再写代码”,RTL代码的每一条语句都有与之对应的电路单元。
图1-36
硬件原则还要求我们对所选用的FPGA的内部结构有所认识和了解,以确保RTL代码风格与FPGA内部结构相匹配,这样才能保证综合电路的质量。例如,7系列FPGA中的触发器复位信号只支持高电平有效,如果代码中的复位是低电平有效,就会消耗额外的查找表(用于逻辑取反),而UltraScale/UltraScale+FPGA中的触发器既支持高电平有效,又支持低电平有效。7系列FPGA中的DSP48不支持异步复位,因此,如果代码中描述的乘法器使用了异步复位,那么相应的触发器是无法被吸收到DSP48内部的。
综上所述,硬件原则如下。
(1)使用可综合的HDL代码描述电路。
(2)先有电路,再写代码。
(3)RTL代码风格与FPGA内部结构相匹配。