gpt4 book ai didi

Verilog 移位扩展结果?

转载 作者:行者123 更新时间:2023-12-02 08:34:22 25 4
gpt4 key购买 nike

我们有以下代码行并且我们知道 regF是 16 位长,regD是 8 位长并且 regE是 8 位长,regC是 3 位长,假定无符号:

regF <= regF + ( ( regD << regC ) & { 16{ regE [ regC ]} }) ;

我的问题是:是否会转移 regD << regC假设结果是 8 位或者它会扩展到 16 位,因为按位 &用 16 位向量?

最佳答案

移位子表达式本身的宽度为8位;移位的位宽始终是左操作数的位宽(参见 2005 LRM 中的表 5-22)。

然而,事情在那之后变得更加复杂。 shift 子表达式显示为 & 运算符的操作数。 & 表达式的位长是两个操作数中最大的一个的位长;在这种情况下,16 位。

这个子表达式现在作为 + 表达式的操作数出现;该表达式的结果宽度又是 + 的两个操作数的最大宽度,同样是 16。

我们现在有一个任务。这在技术上不是操作数,但使用相同的规则;在这种情况下,LHS 也是 16 位,因此 RHS 的大小不受影响。

我们现在知道整个表达式的大小是 16 位;此大小向下传播回操作数,“自定”操作数除外。这里唯一的自定操作数是移位表达式 (regC) 的 RHS,它没有被扩展。

现在确定表达式的符号。传播以同样的方式发生。由于我们至少有一个无符号操作数,因此这里的整体效果是表达式是无符号的,并且所有操作数都被强制为无符号。因此,在实际执行任何操作之前,所有(非自定)操作数都被强制转换为无符号 16 位。

因此,换句话说,移位子表达式实际上以 16 位移位结束,即使乍一看它似乎是 8 位。请注意,它不是 16 位,因为 & 的 RHS 是 16 位,但是,因为整个调整大小的过程 - 宽度向上传播表达式 - 得到 16 的答案。如果您分配给 18 位 reg 而不是 16 位 regF,那么您的类次将有已扩展到 18 位。

这一切都非常复杂且不直观,至少如果您有任何主流语言的经验。 2005 LRM 的第 5.4 和 5.5 节(或多或少)对此进行了解释。如果你需要任何建议,那么永远不要写这样的表达式。防御性写作 - 将所有内容分解为单独的子表达式,然后组合子表达式。

关于Verilog 移位扩展结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23322737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com