硬件原则主要针对HDL代码编写而言。应该明确FPGA/CPLD的逻辑设计所采用的硬件描述语言同软件语言是有本质区别的!以Verilog语言为例,虽然Verilog许多语法规则和C语言相似,但是Verilog作为硬件描述语言,他的本质作用在于描述硬件!应该认识到Verilog是采用了C语言形式的硬件的抽象,他的最终实现结果是芯片内部的实际电路。所以评判一段HDL代码的优劣的最终标准是其描述并实现的硬件电路的性能(包括面积和速度两个方面)。评价一个设计的代码水平较高,仅仅是说这个设计由硬件向HDL代码这种表现形式转换的更流畅、合理。而一个设计的最终性能,在更大程度上取决于设计工程时所构想的硬件实现方案的效率以及合理性。
片面追求代码的整洁、简短,这是错误的,是与评价HDL的标准背道而驰的!
硬件原则的另外一个重要理解是“并行”和“串行”的概念。硬件系统比软件系统速度快、实时性高,其重要原因就是硬件系统中各个单元的运算是独立的,信号流失并行的。而C语言编译后,其机器指令在CPU的高速缓冲队列中基本是顺序执行的,即使有一些并行处理的技术,也是在一定程度上是十分有限的。所以在写HDL代码的时候,应该充分理解硬件系统的并行处理特点,合理安排数据流的时序,提高整个设计的效率。
RTL级Verilog描述语法和C语言描述语法的区别举例:
1、循环
在C语言的描述中,为了使代码执行效率高,表述简洁,经常用到下面的for语句
for(i=0;i<16;i++)
...
Verilog代码设计中,在RTL级编码中极少使用FOR循环,因为for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,每条执行语句并不能有效的复用硬件逻辑资源,造成巨大的资源浪费。RTL硬件描述中,遇到类似算法,推荐的方式是先搞清楚设计的时序要求,做一个reg型计数器,在每个时钟沿累加,并在每个时钟沿判断计数器情况,做相应的处理,能复用的处理模块尽量复用,即使所有操作都不能复用,也采用case语句展开处理。如:
reg [3:0] counter;
always @(posedge clk)
if(syn_rst)
counter <= 4'b0;
else
counter <= counter+1;
always @(posedge clk)
begin
case(counter)
4'b0000:
...
default:
endcase
end
2、条件判断
C语言中主要有if...else和switch语句,两者之间的区别主要在于程序的长短。
Verilog中也有相应的if...else和case语句,但其描述结构就有很大的区别。if...else语句是有优先级的。一般来说第一个if的优先级最高,最后一个else优先级最低。而case语句是“平行”的结构,没有优先级。
转载请注明出处。