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}}