一道笔试题(已解答)
module bishi();
reg signed[3:0]a;
reg [3:0] b;
wire [7:0]z0,z1,z2;
assign z0=(a*b);
assign z1=$unsigned(a*b);
assign z2=$signed(a*b);
initial
begin
a = -3;
b = 4;
#1 $display("a=%d,b=%d,z0=%d,z1=%d,z2=%d",a,b,z0,z1,z2);
end
endmodule
请写出打印输出,并说明理由。
自己跑一下仿真不就知道了。
a= -3,b= 4,z0= 52,z1= 4,z2= 4
I simulated it with vcs ,following shows the result,
But i dont quite know why.
这个题还比较有意思的。虽然并不会常用,但是确实是要对verilog很了解才能做对。
首先要明白二进制数的变换和表示,不太了解的网上搜一下。-3表示成二进制就是1101对应的无符号值是13。
z0 = (a*b) 这里涉及到了verilog的位宽规则,在没有特别设定的状况下,Verilog会依据LHS的操作数宽度来决定RHS操作数的宽度。也就是按照8bits运算,得出52.
后两个算式,括号内的位宽是由刮号内的最大操作数宽度决定的。也就是4bits。所以两个算式结果都是4。
z0= 52很好理解,因为a=-3为有符号数,用补码表示就是4‘b1101=4’d13,13*4=52
z1和z2不好理解,猜测是这样的:在执行系统函数$unsigned和$signed之前并不知道z1和z2的位数,因此将(a*b)的结果按照max{width(a),width(b)}=4进行截断,52=110100阶段之后就是0100=4,经过系统函数$unsigned和$signed转换之后在进行符号位的扩展,就得到z1和z2均为4
这也太bt了吧。
还是看不懂啊
这题目很考验人
不过不同的工具的这些语法的编译还是有所不同的
我有过用$signed语法,modelsim仿真通过,ISE综合后后仿真不通过的悲惨教训
呵呵,这个笔试题很好啊,看来我的verilog基本还是不够啊
牛!
这些平时没用着头一次见就傻眼了
