做矩阵尺寸约束的时候,你得先把行和列的数字处理成符合硬件接口要求的形式。很多硬件接口的行地址必须是64字节的倍数,比如RAM接口,要是不符合这个标准就会出错。所以第一步就是让矩阵的行数m变成64的倍数,用ceil函数向上取整的办法。另外,还要保证Ram_Addr加上m乘n的结果不超过地址上限,也就是65’h4_0000这个数值。这两条规则要写进约束脚本,否则仿真的时候会报错。 VCS仿真跑出来之后,如果看到有“Constraint solver failed to converge”的报错,说明求解器算不出来了。仔细看看日志就会发现问题出在求解顺序上。原来求解器先单独算了一个M_Slice_roundup函数,结果把它算成了一个超大的数值,比如32’h1d6f_b8e5,这个数远远超过了地址上限,把后面的不等式给卡死了。因为这个值被提前锁定住了,其他变量没法调整来配合它,所以就超时失败了。 要解决这个问题,得把M_Slice_roundup函数和Ram_Addr、N_Slice这几个变量一起拉来商量。只需要在命令行加上一条参数就行了:incdir+incdir=./constraints。再看看这次的日志就能发现,现在这三个变量是联合求解的,函数不会再提前跑偏了。 虽然顺序对了,但新的问题又出现了:计算量变大了,求解器又超时了。回到不等式本身来看,M_Slice必须小于等于65’h4_0000除以这个取整后的值。结合其他变量都大于0的条件,可以进一步推出M_Slice不超过32’h4_0000这个数值。把这个上限也写进约束里后,第二次求解终于成功收敛了。 这么一来,矩阵的行列数就不再是随便填的数字了,而是受约束的受控变量。按照这个方法处理完之后,仿真就能顺利通过了。