1、在边沿敏感的always进程中,不是不能阻塞非阻塞混用,而是应当少用,那么什么时候应该混用呢?
答:如果在同一进程中,下面的非阻塞赋值需要用到上面的值,且要求是本时钟沿更新的“新值”,那么上面的赋值语句必须用阻塞赋值。单纯的非阻塞赋值语句如:
begin
out_1<=input;
out_2<=out_1;
end
其中,out_2获得的是上一个时钟沿out_1的值,也即:out_2总是晚out_1一个时钟周期。
2、reg [3:0]A [4:0]为何意?
答:建立5个4位宽的A,A[4][3]表示第5个A的第3位(最高位)。
3、端口类型,及声明注意事项:
在verilog中,所有的端口隐含地声明为wire类型,因此如果希望端口具有wire数据类型,将其声明为三种类型之一即可:如果输出类型的端口需要保存数值,则必须将其显式的声明为reg数据类型。
不能将input和inout类型的端口声明为reg数据类型,这是因为reg类型的变量是用于保存数值的,而输入端口只反映与其相连的外部信号的变化,并不能保存这些信号的值。
注意,在verilog中,也可以使用ANSI C风格进行端口声明。这种风格的声明的优点是避免了端口名在端口列表和端口声明语句中的重复。如果声明中未指明端口的数据类型,那么默认端口具有wire数据类型。
如:
module fulladd4(
output reg [3:0] sum,
output reg c_out,
input [3:0] a,b,
input c_in);
endmodule
3、Verilog中二进制补码运算的溢出问题:[2013-12-31]
二进制补码(two’s complement):其取值范围是[-2N-1,2N-1-1],二进制补码表示法是数字信号处理领域最为流行的有符号数字表示法;它累加多个有符号数时,中间过程如果出现溢出但是最终结果是在有效范围之内,溢出可以忽略,如3位有符号数运算3+2-3=2,3+2=(011+010)2=1012,101用二进制补码表示为-3,溢出了,但是(101-011)2=(101+101)2=0102=210,结果是正确的。
在HDL程序中变量可以在有符号型和无符号型间转换,$signed(x)表示将变量x转换为有符号型表示,$unsigned(x)则表示将变量x转换为无符号型表示,其中转换过程并不会导致变量中具体位0、1间变化,只是表示方式的变化,在参与运算时结果将会发生变化。
4、Verilog中位拼接运算的应用。
默认情况下:reg类型被作为无符号数看待。
sum4 = a + {4{c[3]}, c};//此处reg [3:0] c。表示将c的最高位-扩展为4位与c拼接。
5、嵌入式乘法器
直接写的*综合器会把它综合为自带的乘法器,占用了乘法器资源,自己写乘法器省资源。特别是对简单的几bit乘法的情况,没必要再消耗一个乘法器。当然,不是什么综合器都能认*的,lz最好在代码内不要写*。
咳咳,如果是定系数乘法,移位加比较省
如果是两个变量乘就直接*好了,具体实现的时候在选择不同的方式