bai*_*ibo 2 verilog synthesis hdl flip-flop
我们有以下代码行,我们知道它regF是16位长,regD长regE8位,长8位,长regC3位,假设无符号:
regF <= regF + ( ( regD << regC ) & { 16{ regE [ regC ]} }) ;
Run Code Online (Sandbox Code Playgroud)
我的问题是:移位是regD << regC假设结果是8位还是会因为&16位向量的按位而扩展到16位?
shift子表达式本身的宽度为8位; 移位的位宽始终是左操作数的位宽(参见2005 LRM中的表5-22).
然而,事情变得更加复杂.shift子表达式显示为运算&符的操作数.所述的比特长度&表达式的最大的2个操作数的比特长度; 在这种情况下,16位.
此子表达式现在显示为表达式的操作数+; 此表达式的结果宽度又是两个操作数的最大宽度+,也就是16.
我们现在有一项任务.这在技术上不是操作数,但使用相同的规则; 在这种情况下,LHS也是16位,因此RHS的大小不受影响.
我们现在知道整体表达式大小是16位; 除了'自定'操作数之外,这个大小会传播回操作数.这里唯一的自定义操作数是shift表达式(regC)的RHS ,它没有被扩展.
表达式的签名现已确定.传播以同样的方式发生.由于我们至少有一个无符号操作数,因此这里的整体效果是表达式是无符号的,并且所有操作数都被强制转换为无符号.因此,在实际执行任何操作之前,所有(非自定义)操作数都被强制转换为无符号16位.
因此,换句话说,移位子表达式实际上最终为16位移位,即使它看起来似乎是8位.请注意,它不是 16位,因为它的RHS &是16位,但是因为整个大小调整过程 - 表达式的宽度传播 - 得到了16的答案.如果你被分配到18位reg,而不是16位regF,那么你的班次将扩展到18位.
这是非常复杂和非直观的,至少如果你有任何主流语言的经验.它(或多或少)在2005 LRM的第5.4和5.5节中进行了解释.如果你想要任何建议,那么永远不要写这样的表达式.防御性写 - 将所有内容分解为单个子表达式,然后组合子表达式.