学习摘自数字芯片实验室
Verilog运算符==,===之间有什么区别?
“= =”逻辑相等运算符用于建模硬件,不比较高阻抗或不定值。
如果“==”运算符的操作数包含X或Z,那么结果是不定值,是一个“X”。 例如,
a = 2’b1x ;
b = 2’b1x ;
if(a == b)
$display(“reachedif”) ;
else
$display(“reachedelse”) ;
由于至少有一个操作数包含X,所以结果是X,在这种情况下,显示消息“reached else”,尽管看起来a和b似乎相等。
“= = =”运算符为全等运算,它会比较高阻抗和不定值。例如,
a = 2’b1x ;
b = 2’b1x ;
if(a ===b)
$display(“reachedif”);
else
$display(“reachedelse”);
在上面的代码,显示“reached if”。如果“X”用“Z”替代,同样显示“reached if”。
Verilog“<<,>>”和“<<<,>>>”有什么区别?
“<<,>>” 是逻辑移位运算符,“<<<,>>>”是算术移位运算符
逻辑左移(<<),算术左移(<<<)和逻辑右移(>>)运算符,腾出的位用0填充。
在算术右移运算符(>>>)中, 如果左操作数是无符号数,则腾出的位用0填充;如果是有符号数,则腾出的位用最高位填充。
以下示例:
module test;
reg[7:0] tmp1 ,tmp2 ; //default unsigned
regsigned [7:0] tmp3 ,tmp4 ; //signed
initialbegin
tmp1= 8’b0000_1100 ;
tmp2= tmp1 << 4 ; //logical unsigned shift left
$display(“tmp2= %b”,tmp2) ; //tmp2 = 1100_0000
//arithmeticunsigned shift left
tmp2 <= tmp1<<< 4 ;
$display(“tmp2 =%b”,tmp2) ; //tmp2 = 1100_0000 ;
tmp1 = 8’b1000_1100;
//logical unsignedshift right
tmp2 = tmp1>>> 2 ;
$display(“tmp2 =%b”,tmp2 ) ; //tmp2 = 0010_0011
tmp3= 8’b1000_1100;
//arithmetic signedshift right
tmp4 = tmp3>>> 2 ;
$display(“tmp4 =%b”,tmp4 ) ; //tmp4 = 1110_0011
//Note that themsb “1” got filled in all
//vacated bit’s
end
endmodule //test