在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 25277|回复: 21

请教Verilog高手关于位拼接运算符的问题

[复制链接]
发表于 2009-4-14 20:41:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
有如下的一些源代码:
/////////////////////////////////
/信号声明
input [1:0] a,b,c;
input clk;
output [3:0] sum;
output cout;
/数据说明
reg [3:0] sum;
reg cout;
always @(posedge clk)
begin
/* 本语句的目的是把c赋给sum的低两位,同时把a+b的值赋给sum的高两位,
而由a+b产生的进位则赋给cout */
   {cout,sum}={a+b,c};
end
////////////////////////////////
上面就是代码的内容,可是在仿真的时候却发现a+b产生的进位根本没有
赋给cout,请问这是怎么回事?是拼接语句不对还是哪里出了问题?望
高手能给予解答,谢谢!!!
下面是仿真加的激励:
c=2'b11; a=2'b11; b=2'b10;
从上面的激励,结果应该是
sum[1:0]=c=2'b11;
sum[3:2]=a+b=2'b10;
同时a+b产生一个进位,即
cout=1;
可是结果却没有产生这个进位,不清楚是不是位拼接语句用的不对。
发表于 2009-4-15 09:29:23 | 显示全部楼层
你的置位运算符用的不太对,a+b它也是当成两位数来进行计算的,所以,等式的左边是5位,右边是4位表达式,左边的最高位自动设置为0
发表于 2009-4-15 17:34:49 | 显示全部楼层
楼上说的MS是对的
 楼主| 发表于 2009-4-15 20:57:16 | 显示全部楼层
可是我也试过这种情况没有问题:
reg [3:0] sum;
reg cout;
input [3:0] a,b;
input cin;
{cout,sum}=a+b+cin;
/*  这种它能正确把进位位赋给cout,a,b都是4位呀,可是等式左边也是5位,为什么就没有问题呢? */
发表于 2009-4-15 23:52:11 | 显示全部楼层
最好是先对a和b进行符号位扩展后再实现加法运算!
发表于 2009-4-24 14:04:18 | 显示全部楼层
{cout,sum}=a+b+cin;
这种情况下,a+b+cin软件自动把结果扩展成5位,所以这个没有问题的,但是在位操作符里,没有做这样的自动扩展





原帖由 gatezte2008 于 2009-4-15 20:57 发表
可是我也试过这种情况没有问题:
reg [3:0] sum;
reg cout;
input [3:0] a,b;
input cin;
{cout,sum}=a+b+cin;
/*  这种它能正确把进位位赋给cout,a,b都是4位呀,可是等式左边也是5位,为什么就没有问 ...

发表于 2010-11-17 10:56:07 | 显示全部楼层
LS有理啊
发表于 2010-11-17 10:58:53 | 显示全部楼层
正解,谢谢 分享
发表于 2010-11-17 14:54:20 | 显示全部楼层
楼上正解, 小弟再补充下:
首先我们分析一下这个问题的由来.楼主遇到的情况实际上是关于verilog 表达式位宽的问题, 也就是所谓的expression bit lengths的问题. 再细化下,就发现是表达式做evaluation也就是更新值的时候位宽如何对齐而产生的问题.
比如一个reg [3:0] sum;
reg[2:0]a,b;
sum = a + b; // expression evaluates using 4 bits
这就是一个自动扩位的情况.
正如楼主所说的情况,verilog是不会自动扩位的. 那么这很容易产生一个疑惑,就是在那些情况会扩位那些情况又不扩位呢?
当然,verilog会有一个明确的规定:
在说这个规定前,首先有个关于self-determined(这个determined 就是决定其宽度的意思) expression的说法.关于这个说法我是这样理解的,就是对于一个表达式,如果它不是self-determined的,那么它必然又有其他的原因帮他来确定宽度的,在我遇到的情况里面这个其他原因就是赋值语句的左边位宽的情况.
好,我们反过来看self-determined expression有那些属于这个

attached

attached

如图所示,这些都是self-determined expression楼主所遇到的如图倒数第二排的{},说到这里大家应该比较清楚了吧,楼主所遇到的情况正是因为使用了self-determined expression从而让右边表达式自己已经决定了自己的位宽,从而不会把进位位扩展到左边.而如果不使用上图中的这些情况如sum = a + b; 位宽会随右值的宽度进行改变.



s
发表于 2010-11-17 22:24:45 | 显示全部楼层
顶楼上!学习了!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-17 03:48 , Processed in 0.030830 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表