注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

dp: 生活的脚步,进步的点滴...

Cam、DSP、FPGA、PM、Life、More ...

 
 
 

日志

 
 

verilog模块表达式变量传递  

2013-03-21 09:35:50|  分类: 专业 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
H:\bkup\private\2013diary.x.html
verilog模块输入变量如果是表达式,且表达式中变量的位宽与输入变量要求的位宽不一致,会出问题。
也就是说并没有自动把表达式运算结果的位宽(线宽)扩至要求的输入变量位宽(线宽),导致不足的位(线)值为"Z"

举例如下:
//模块m0声明
moudle m0 (
        output [15:0]  width,
        output [15:0]  height
        );

//模块m1声明
moudle m1 (
        input         clk,
        input         rst,
        input [31:0]  size,
        output        result
        )

reg [31:0] counter;

always @ (posedge clk or posedge rst)
if(rst)
    counter <= 32'h0;
    else
    counter <= counter + 32'h1;
endmodule

always @ (posedge clk or posedge rst)
if(rst)
    result <= 1'b0;
else if(counter == size)
    result <= 1'b1;

//模块m0、m1例化
m0 m0_inst (
        .width  (width ),
        .height (height)
);

m1 m1_inst (
        .size(width * height),
        .result(result)
)


上述运算中,result一直不会为1,仿真发现size值为Z,即把(width * height)传递给size时发生了错误。其中,size的高16位为"Z",低16位为(width * height)积的低16位。
如何避免?
方法1:模块1输出32位的size,然后传递给m1使用;
方法2:写法改为:.size({16'b0,width} * {16'b0,height}),

但在赋值运算中,如果把两个16位数相乘赋给一个32位数,不足的位会被置"0",32位数中不会出现"Z"。
如:
reg [31:0]  sum;
always @ (posedge clk)
    sum <= 16'd65535 * 16'd1000;

结果sum为正确的32位数,不会有某个bit位被置"Z"。

分析:
1."Z"为高阻,在模块间传递为wire型,线宽不会随意增加;
2.赋值运算中变量为reg类型,不会有"高阻态Z",只可能有"未知值X",赋值时低位宽自动被扩展为高位宽,高位补"0";
  评论这张
 
阅读(406)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016