ai didi

verilog "~"运算符加法运算给出了不需要的结果

转载 作者:行者123 更新时间:2023-12-04 21:14:03 24 4
gpt4 key购买 nike

在以下简化的 Verilog 代码中:

wire [31:0] depth;
wire mode_u2 = 1'h0;

assign depth = 'h80 + (~mode_u2);

如果我做一个深度显示,并用 VCS 模拟它(2014.12-1)
$display("depth is 0x%2x", depth);

我收到 0x7f , 而不是预期的 0x81 .似乎 ~mode_u2 被视为负 1。

如果我改变 ~mode_u2!mode_u2 .我按预期得到 0x81。

更有趣的是如果我这样做 wire mode = ~mode_u2然后 assign depth = 'h80 + (~mode)而不是 0x80 , 我得到 0x7e
我在这里错过了什么吗?

有人可以解释为什么 ~+ 中以这种方式表现手术?或者这是模拟和综合不同情况之一?

非常感谢!!

威利

最佳答案

在加法完成之前,加法运算符的操作数需要扩展到左侧的大小(或两个操作数的最大宽度,取决于上下文)。

在这种情况下 mode_u2需要扩展到32位。我找不到这方面的引用,但看起来位扩展名优先于 ~运算符(operator)。这意味着:

depth = 'h80 + (~mode_u2) = 
32'h0000_0080 + (~32h0000_0000) =
32'h0000_0080 + 32'hffff_ffff =
32'h0000_007f
!的结果运算符,但是根据定义是一个位,我的猜测是位扩展发生了两次:
depth = 'h80 + (!mode_u2) = 
32'h0000_0080 + (!32'h0000_0000) =
32'h0000_0080 + 1'h1 =
32'h0000_0080 + 32'h0000_0001 =
32'h0000_0081
mode 类似:
depth = 'h80 + (~mode) = 
32'h0000_0080 + (~32'h0000_0001) =
32'h0000_0080 + 32'hffff_fffe =
32'h0000_007e

关于verilog "~"运算符加法运算给出了不需要的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28639905/

24 4 0
文章推荐: php - Joomla 自定义模板覆盖不起作用
文章推荐: list - Haskell:编译函数与解释函数之间的奇怪差异,这些函数打印连接的无限列表
文章推荐: ios6 - 如何强制使用较少项目的 UICollectionView 滚动?
文章推荐: svg - 沿着 d3 路径移动一个圆圈,以不同的速度动画
行者123
个人简介

我是一名优秀的程序员,十分优秀!

滴滴打车优惠券免费领取
滴滴打车优惠券
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com