本文首发于公众号【木叶芯】,版权所有,禁止转载。
如需转载,请在评论区留言或私信申请,经同意后可转载,否则属于侵权行为。
作者昵称:城外南风起
————————————————
verilog中,逻辑移位与算术移位的右移符号分别为“>>”和“>>>”,左移同理。
两者的区别在于:逻辑移位不考虑符号位,左移和右移都只补零;算术移位考虑符号位,左移补零,右移补符号位。
在vivado中进行行为级仿真,原始数据位32’hFF00ABC4,dout1为先逻辑左移再逻辑右移,dout2和dout3为先逻辑左移再算数右移。dout2和dout3的区别在于,verilog默认是无符号的,需要通过$signed声明有符号数。如果不声明,则会默认为无符号数,从而不区分算术左移与逻辑左移。
testbench仿真代码:
module test();
wire [31:0] din,dout1,dout2,dout3;
assign din = 32'hFF00ABC4;
assign dout1 = (din<<2)>>4;
assign dout2 = (din<<2)>>>4;
assign dout3 = ($signed(din<<2))>>>4;
endmodule
仿真结果:
可以看到,dout1 = 0fc02af1,dout2 = 0fc02af1,dout3 = ffc02af1。结果正确。
————————————————
感谢您的阅读,欢迎 点赞 / 评论 / 收藏 / 打赏 ~
我是城外南风起,欢迎关注我的公众号【木叶芯】。
以下链接可以快速搜索公众号内的文章:号内搜
木叶飞舞之处,火亦生生不息。