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语句内不能对同一个变量多次赋值,即对变量的赋值不能由多个时钟(也包括同一时钟的不同时钟沿即posedge和negedge)控制。
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、