DML 1.4同寄存器跨字段依赖:首次置位CC.EN如何规避CC.CSS违规
解决DML 1.4同寄存器字段依赖导致的spec-viol误触发问题
问题根源
写入CC寄存器设置EN为1时,CSS字段的write方法会被触发(哪怕未修改CSS的值),此时若CC.EN.val已被更新为1(或同一次写入事务中EN的新值已生效),就会触发违规日志。
解决方案1:仅当CSS字段被实际修改时执行检查
在CSS的write方法中先判断写入值是否与当前值一致,未修改则直接返回,跳过检查逻辑:
register CC { field CSS @ [6:4] is write { method write(uint64 value) { // 未修改CSS字段,直接返回 if (value == CSS.val) { return; } if (CC.EN.val == 0b1) { log spec_viol: "Command set selection should not " + "occur when controller has been enabled."; return; } default(value); } } field EN @ [0]; }
解决方案2:将逻辑移至寄存器层面统一处理
放弃字段级的write方法,在寄存器的write方法中统一处理字段依赖检查,逻辑更可控:
register CC is write { field CSS @ [6:4]; field EN @ [0]; method write(uint64 value) { uint64 new_css = extract(value, 6, 4); uint64 new_en = extract(value, 0, 0); // 仅当CSS被修改且EN已处于启用状态时触发违规 if (new_css != CSS.val && CC.EN.val == 0b1) { log spec_viol: "Command set selection should not " + "occur when controller has been enabled."; // 仅更新EN字段,保留原CSS值 EN.val = new_en; return; } // 正常更新所有字段 default(value); } }
解决方案3:允许同一次写入中同时配置EN与CSS
使用is_modified(EN)判断EN是否在本次写入中被修改,允许初始化时同时设置EN和CSS的操作,避免误判:
register CC { field CSS @ [6:4] is write { method write(uint64 value) { // 仅当EN已启用且未在本次写入中被修改时,才触发违规 if (CC.EN.val == 0b1 && !is_modified(EN)) { log spec_viol: "Command set selection should not " + "occur when controller has been enabled."; return; } default(value); } } field EN @ [0]; }
内容的提问来源于stack exchange,提问作者toffe
相关产品推荐
相关产品推荐

