请问verilog里大括号{}在四则运算中的用法?

请问,如下verilog语句:

reg cout;
reg [3:0] sum;
reg [3:0] a;
reg [3:0] b;
......
{cout, sum} <= {a +b};
......
仿真发现进位cout始终为0,查看综合结果,cout直接被接地了

反复试了很多次,发现将等号右端的大括号去掉就对了:
{cout, sum} <= a +b;

请问是什么原因?

第1个回答  2021-11-24
大括号是常见的标点符号,在数学里表示某些运算要优先进行,如果一个算式里既有小括号、中括号,又有大括号,我们得先算小括号里面的,再算中括号里面的,最后算大括号里面的。
希望我能帮助你解疑释惑。
第2个回答  2021-11-24
verilog那个{,}是拼接的意思,a+b是不需要大括号的,因为sum只有4位跟a和b一样,所以a+b可能发生溢出,这样在sum的前面扩展一位,这个通过大括号来实现。所以你开始的写法是错误的,后面才是对的写法。
第3个回答  2021-11-23
在Verilog HDL语言有一个特殊的运算符:位拼接运算符{},用这个运算符可以把两个或多个信号的某些位拼接起来进行运算操作。其使用方法如下:

即把某些倍号的某些位详细地列出来,中间用逗号分开,最后用大括号括起来表示一个整体信号,例如:

也可以写成为:

在位拼接表达式中不允许存在没有指明位数的信号。这是因为在计算拼接信号的位宽的大小时必需知道其中每个信号的位宽。
位拼接也可以用重复法来简化表达式,如下所示:

位拼接还可以用嵌套的方式来表达,如下所示:位拼接运算符不会主动的为表达式的计算结果当成变量来扩位的,它只会按照程序员定义的变量的位宽来把数据拼在一起,这里,运算符中的表达式x+t结果并没有存在变量中,所以默认结果位数与表达式中拥有最宽位数的操作数相同,所以这里就把进位丢掉了。
verilog不像C语言,它不是高级语言,你写乘号有时是可以的,但是有时是不可以的,所以不要使用乘号,更不要使用除号,因为除法在FPGA中是不能在一个周期之内出结果的。为什么有时可以有时不可以呢?因为用来综合你的程序的软件
相似回答