Verilog Language
Basics
simple wire
wire信号只能被一个信号所驱动,但wire可以驱动多个信号
wire是连续赋值,即始终等于。而软件是在某个时刻赋值
four wires
not gate/and gate/ n or gate/ nor gate/xnor gate
非门 ~ ! 与门 & 或非门
异或xor 同或nxor
^
wire_decl
在定义中间变量时,可以给他们幅值
7458
Vectors
vector(向量) and detail
向量可以看做是一组wire的合集
type [upper:lower] vector_name;
这里你需要了解一个向量的比特顺序(endianness)信息,比特顺序取决于向量的 LSB 是向量的高位还是地位。比如声明为 [3:0] w 的向量,LSB 是 w[0],如果声明为 [0:3] w,那么 w[3] 是 LSB 。LSB 指的是二进制数中权值最低的一位。
unpacked vs. packed 数组
tpye [位宽]name[数量]
tpye[数量][位宽]name
在 assign 赋值操作中,如果等号左右两侧信号的位宽不同,那么就会进行截断或者补零操作
bitwise operators
&表示按位与
&&表示逻辑与,最终输出1bit结果
{ }拼接运算符,可以在=左右两侧
{ 重复次数 { 向量 } }。
重复操作符的应用场景之一是在有符号数的扩展。有符号数的扩展是将符号位填充待扩展的比特。比如要将 4bit 的 4'b0101 有符号数扩展为 8bit ,0 是符号位,那么扩展之后为 8'b0000 0101.
拼接运算法的应用:
assign out = ~{{5{a}},{5{b}},{5{c}},{5{d}},{5{e}}} ^ {{5{a,b,c,d,e}}};
全加器优化问题:
左图为逐级进位,右图为选择进位
左图需要等上一级cout的结果,才能进行高位的运算
右图不需要等cout的结果,低位高位一起算,直接将高位的分为两种情况:高位有进位、高位无进位,将两种情况同时计算好直接通过低位的cout选择高出输出。