[SV] 结构体的约束 - bulaqi/IC-DV.github.io GitHub Wiki

1. transaction内约束结构体的注意事项

  • 1.注意位宽一定要一致
  • 2.数据结构的变量,和数据的都要是rand类型(双双都是rand类型)
  • 3.循环复制需要消息,建议用低地址加,而不是用高地址减,并且最高的需要溢出保护。

2. 示例

typedef struct {
	rand bit[63:0] base_addr;
	rand bit[32:0] depth;
} queue_reg_cfg_s;

class pf_cfg_pkt extends uvm_sequnence_item
	rand queue_reg_cfg_s iocq_ring[32]; //此处也需要rand
	// 此处正确
	constraint iocq_rang_cons{
		iocq_ring[0].base_addr inside {[63'h10_0000:63'h30_0000]};
		iocq_ring[0].depth inside {[100:300]};
		foreach(iocq_ring[i]){		
			if(i==32) {
				iocq_ring[32].base_addr == iocq_ring[31].base_addr + 4*4*iocq_ring[31].depth;   //在transaction内不能之间约束数组之间的依赖,因为此时没有randomize,前一个元素还未随机出内容
				iocq_ring[32].depth inside {[100:300]};
			} else{
				iocq_ring[i+1].base_addr == iocq_ring[i].base_addr+4*4*iocq_ring[i].depth;
				iocq_ring[i+1].depth inside {[100:300]};				
			}
			
		}
	}
	 
	// 注释代码错误,约束失败,原因不明
	//constraint iocq_rang_cons{
	//		if(i<1) {
	//			iocq_ring[i].base_addr == {[63'h10_0000:63'h30_0000]}; 
	//			iocq_ring[i].depth inside {[100:300]};
	//		} else{
	//			iocq_ring[i].base_addr == iocq_ring[i-1].base_addr+4*4*iocq_ring[i-1].depth;
	//			iocq_ring[i].depth inside {[100:300]};				
	//		}
	//		
	//	}
	//}
endclass
⚠️ **GitHub.com Fallback** ⚠️