FPGA基础(3)verilog综合相关基础

1、在综合过程中,对于代码需要考虑

①数据类型如何转换为硬件

②常量如何映射成逻辑值

③语句如何转变为硬件

2、确保verilog语法写出来的模型是可以综合的

寄存器类型里:reg和integer类型可综合,time和real不可综合

在综合过程中:delay或者#10这种操作是无法综合的,会被忽略

3、连续赋值的综合过程,往往是将每一位综合出一个对应的门电路,有着一一对应的关系。

4、支持常量的部分选取,不支持非常量的部分选取,对于非常量下标会综合成多路选择器。

5、always语句中应包含所有读取的变量,否则综合出来的网表和实际功能不一致。

always@(A)

Z=A&B,

那么综合的结果是一个与门,A或B值变化结果都会变化,但是触发条件只有A,所以就少了B事件发生而触发Z值发生变化的情况,应该为always@(A or B)

6、锁存器的产生:(为什么产生的是锁存器,因为锁存器是电平敏感的)

①变量未能在always中所有可能的过程中被赋值(比如if语句中有else分支未对其赋值),就会推导出锁存器。

②局部变量未在所有分支中被赋值,也会产生锁存器。

③赋值前被引用,同样会产生锁存器。

避免锁存器的产生:

①通过full_case或者default指令来避免锁存器的产生,或者在case语句之前给变量进行默认赋值。

②当case各语句互斥时,通过使用parallel_case指令来避免优先级逻辑(潜逃可能会很深),而是综合成译码逻辑,各分支是并行的。

7、循环语句,包括for、repeat、while、forever,综合过程是对循环变量的每一个取值,复制for循环内的所有语句一次。

8、时序逻辑建模时使用非阻塞赋值(除非使用中间变量时可以使用阻塞赋值),组合逻辑建模时使用阻塞赋值,当变量在时钟沿变化时被赋值就会产生触发器,触发器个数与变量位数相同。

但是有一个例外,如果变量的赋值和引用出现在同一条语句中,则该变量被视为中间变量,不会产生触发器。

9、    多个时钟时,不同时钟控制的always语句内不能对同一个变量多次赋值,即对变量的赋值不能由多个时钟(也包括同一时钟的不同时钟沿即posedgenegedge)控制。

10、当产生触发器时,阻塞赋值和非阻塞赋值的综合是不一样。

always@(posedge clk)

begin

        B=A;   //阻塞赋值

        C<=B;  //非阻塞赋值

        D<=C;  //非阻塞赋值

end

那么会映射出B、C、D各一个上升沿触发器,由于B=A采用的阻塞赋值,C<=B使用的是B的新值,这意味着B触发器的数据输入端应该通过门电路连接到C触发器的数据输入端,而D<=C使用的是C的老值,因此应将C触发器的输出端连接D触发器的数据输入端

11、函数调用实在组合逻辑中直接插入函数代码,函数内部的变量都视为临时变量来处理,这些变量都会被综合为一条连线。

12、任务调用可以表达组合逻辑,也可以表达时序逻辑,这取决于调用的上下文。

13、X值和Z值

如果在case或者fi语句中,使用了X值或Z值,则该分支在综合时不会被执行,此时出现功能不一致,应避免在case语句中使用x值或Z值。

Z值可以用于产生三态门(有0、1、高阻即Z三种状态)。

14、模块实例化语句在综合过程中被视为黑盒,只有输入输出等接口,内部逻辑结构不可见。

15、采用参数化设计,在修改模块功能时较为方便。

16、Moore状态机的输出只与状态有关,与输入无关。

描述:always语句中使用case语句。

Mealy状态机的输出既与机器状态有关,也取决于输入。

描述:两条always语句,一条描述时序逻辑,一条描述组合逻辑。

状态编码可以使用整数或者参数进行赋值,使用参数的话易于修改,比较方便。

17、移位寄存器的作用:左移、右移、保存值、值的载入。

18、格雷码计数器的第一位和二进制第一位相同,从第二位开始每一位都是二进制的当前位和前一位的异或结果。

19、优化一般有两个方向:降低时延、减小面积。

优化方式:资源分配、公共子表达式、代码移位、公因子提取、交换律和结合律

可以通过将always语句分割为两个always语句来实现消除触发器

对于锁存器,可以在所有分支中对变量赋值或者初始化赋值来消除。

20、

你可能感兴趣的:(FPGA基础(3)verilog综合相关基础)