变量拼接中遇到的奇怪问题——使用运算符导致实际位宽与期望位宽不符

1. 2'hA优先级

    以下方式是仿真中常常用到的数据拼接定义方式。

    data = {`TC'h01,`FIX'h0, `FINE'h0, `COARSE'h01};

    其中TC/FIX/FINE/COARSE是通过`define定义的。在我最近的项目中,有一个变量需要拆分,我使用了下面的定义方式。

    data = {`TC'h01, `CMP_MODE/2'h0, `FIX'h0, `FINE'h0, `COARSE'h00, `CMP_MODE/2'h0, `FIX'h0, `FINE'h0, `COARSE'h00, `TIM_RESV2'h0, `FIX'h0, `FINE'h7, `COARSE'h01, `FIX'h1, `FINE'h5, `COARSE'h01, `FIX'h7, `FINE'h2, `COARSE'h01, `FIX'h0, `FINE'h0, `COARSE'h01};

     我在仿真中将data打印出来,却变成下面这样。

    xxxxxx00001c04d01e804001

    高24bit全部变成了x。这个问题折磨了我好久,通过对比数据发现x以后的数据全部是正确的。再进一步对比从右侧开始第一个x的位置发现,出错的地方就是`CMP_MODE/2'h0这个位置。很显然,`CMP_MODE/2'h0这个用法有问题。2'h0的优先级应该高于/,所以实际上计算的是`CMP_MODE除以0,结果肯定不正确。修改后的定义如下。

    data = {`TC'h01, {`CMP_MODE/2{1'b0}}, `FIX'h0, `FINE'h0, `COARSE'h00, {`CMP_MODE/2{1'b0}}, `FIX'h0, `FINE'h0, `COARSE'h00, `TIM_RESV2'h0, `FIX'h0, `FINE'h7, `COARSE'h01, `FIX'h1, `FINE'h5, `COARSE'h01, `FIX'h7, `FINE'h2, `COARSE'h01, `FIX'h0, `FINE'h0, `COARSE'h01}

    将`CMP_MODE/2'h0换成{`CMP_MODE/2{1'b0}},仿真时就能输出正确数据了。

    01000000001c04d01e804001

    比如`T1*`T2'hF中`T2'hF的优先级最高,比如`T2为4,`T1为2,结果是30。

2. (`T1*`T2)'hFFF是错误语法

    {(`T1*`T2){1'b1}}和{`T1*`T2{1'b1}}都是正确的语法,等效于{8{1'b1}},但是(`T1*`T2)'hFFF就是错误的,即'hFFF前面的数字不能加括号。所以使用`define时需要注意。

    `define T1  2

    `define T2  4

    `define T3  `T1+`T2

    reg    [ 7: 0]   data = `T1*`T2'hf;    //其结果等于30,而不是8'hff

    reg    [ 7: 0]   data1 = (`T1*`T2)'hf;   //语法错误,会报错

    reg    [ 3: 0]   data2 = {`T3/2'{1'b1}};   //其结果不是7,而是5,即{`T1+`T2/2{1'b1}}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值