Verilog基础知识总结03
1.怎样传递参数,介绍传参的两种方式
1.利用defparam定义参数声明语句
格式:defparam 实例化模块名.参数名=常数表达式
defparam可以重新定义参数值,但是不可综合
2.利用符号#
格式:被引用模块名 # (参数1,2,3)例化模块名(端口列表)
新的参数必须和被引用模块的参数一一对应,没变的写原值,不能省略
2.连续赋值语句需要注意的四点
1.赋值目标只能是线网型(wire型);
2.在连续赋值语句中,只要语句的右边表达式任何一个变量有变化,表达式立即被计算,计算的结果立即赋给左边的信号;
3.连续赋值语句不能出现在过程块中;
4.多个连续赋值语句之间是并行语句,因此与位置顺序无关
3.initial和always块有哪些注意事项
1.initial和always块都要求是reg型;
2.initial只执行一次,always块是根据敏感信号列表中的信号变化而变化,只要其中的敏感信号变化,always块就执行一次;
3.always块必须与一定的时序控制结合,超过两条(包含两条)语句要在begin end或fork join语句中执行;
4.敏感信号不能为z/x
4.异步时序电路和同步时序电路的区别?异步电路和同步电路的区别?异步电路和异步时序电路有关系吗?
1.异步时序电路:不是所有的触发器都在同一个时钟控制下,触发器的触发方式不同;
2.同步时序电路:所有的触发器在同一个时钟控制下,触发器的触发方式相同;
3.异步电路:不受时钟控制;
4.同步电路:受同一个时钟控制
5.parameter和define的区别
parameter是参数定义,一般小写,写在module之后;
define是宏定义,一般大写,写在module之前
6.“#”的两个作用及使用方式
1.延时:#+数字,表示延时多少个时间单位
2.参数的传递(传参):在实例化时,写在模块名和实例名之间,用#()表示参数传递,且参数必须与被引用模块中的参数一一对应,没有变化的参数值不能省略,必须写上原值
7.if else和case的区别
1.if else:对于每个判定,只有两个分支,且是顺序执行,只有当上一个判断条件不满足时,才执行下一条语句;
2.case:多分支语句,可以有多种情况执行不同语句,也是顺序执行,可以使用if elseif else和case语句
8. 和=的区别,缩减运算符和位运算符的区别
等于运算符,两边的操作数必须逐位相等,结果为1,当操作数中有x或z,结果为x;
全等运算符,若两个操作数的相应位完全一致,则结果为1;否则为0。
缩减运算符是单目运算符,对单个操作数进行递推运算;
位运算符,结果与操作数的位数相同,其中的双目运算符要对两个操作数的相应位进行逐位运算。
9.%在运算符号中是什么运算?其运算结果符号位取哪一个操作数的符号位?
%在运算符号中是求模运算,其两侧操作数均为整型数,求模运算结果值的符号位取第一个操作数的符号位。
10.位拼接运算符的用法
位拼接运算符为{ } • 用于将两个或多个信号的某些位拼接起来,表示一个整体信号。在进行加法运算时,可将进位输出与和拼接在一起使用。
可用重复法简化表达式,如:{4{w}} //等同于{w, w, w, w}
还可用嵌套方式简化书写,如: {b, { 3{a, b} } } //等同于{b, {a, b}, {a, b}, {a, b}},也等同于 {b, a, b, a, b, a, b}
11.为什么说合理地使用拼接符可以提高程序的可读性和可维护性?拼接符表示的操作其物理意义是什么?
借助拼接符可以用一个符号名来表示由多位信号组成的复杂信号。
其物理意义是将多个信号结合成一个信号。