目前刚做完Verilog language模块,遇到的大多数都是基础题,作为初学者还是有不少的错误的,大概记录一下
Module shift8
1、always中不能使用assign
2、case语法使用错误
3、题中sel为2位且为十进制,2'dxxx
4、声明q1,q2,q3未设置位数,导致电路对输出错
Module cseladd
1、声明sum时需要用到reg而不能使用wire
Always if
1、条件语句可以使用assign a = (condition) ? x:y;或if语句
三目运算符:(condition ? if_true : if_false)
Always if2
避免锁存器的方法
1、case语句确收defult
2、if语句加else,或对信号进行赋初值
3、always中在赋值表达式右侧出现的信号必须出现在always@(敏感电平信号)中列出
Always casez
casez 将数值中的z视为不在乎
Bcdadd100
刚开始用的是always语句一直会报错,通过搜索发现应该使用generate语句,不是很理解,后面再思考一下
generate语句的用法
1、用来构造循环语句,用来多次实例化某个模块
2、构造if-generate或case-generte语句,用力在多个模块中至多选择一个模块
3、用来断言
在使用generate语句时必须且仅能使用genvar来定义循环变量;循环语句需要有模块名定义在begin之后
genvar i;//i为正整数循环变量
generate for()
begin:ava //begin后跟模块名
/*
需要循环的代码
*/
end
endgenrate
补充几个比较基本的概念:always模块中赋值左侧仅能为reg类型变量;assign用于给wire变量进行赋值
阻塞赋值(a=b)
1、赋值语句立即执行,运行完该语句后才运行下一句
2、运行至此,赋值语句左侧变量值立即改变
非阻塞赋值(a<=b)
1、执行至此,先计算<=右侧值,但不会立即给左侧变量进行赋值
2、always代码块执行完毕后才完成赋值操作
何时使用
1、时序电路中使用非阻塞赋值
2、always建立组合逻辑电路模型时使用阻塞赋值
3、在同一个always块中如同时存在时序和组合逻辑电路时,使用非阻塞赋值
4、严禁在always中同时使用非阻塞和阻塞赋值
5、严禁在多个always块中对同一个变量进行赋值