Specman技术问询:为序列分配无符号(uint)十进制整数
在Specman中为序列的uint类型分配无符号十进制整数
咱们先拆解你的需求:你需要给CONFIG_ADC_CLK序列里的divide_by和align_by这两个uint(bits:4)类型的字段,分配合法的无符号十进制整数值,同时保证序列执行时能正确映射到寄存器配置。下面分几种常见场景给你说明:
一、实例化序列时直接手动赋值
这是最直观的方式,在创建序列实例后,直接给字段指定十进制无符号整数即可:
// 创建序列实例并手动赋值 var adc_clk_seq : CONFIG_ADC_CLK ocp_master_sequence_q; adc_clk_seq = new(); adc_clk_seq.divide_by = 4; // 直接给uint类型分配十进制值,只要在0-15范围内(4bit无符号的取值范围)就行 adc_clk_seq.align_by = 3; do adc_clk_seq;
二、通过约束自动生成合法值
如果需要随机生成符合业务逻辑的十进制值,可以给序列添加约束块,限定字段的合法取值范围:
extend CONFIG_ADC_CLK ocp_master_sequence_q { divide_by : uint(bits:4); align_by : uint(bits:4); // 添加约束,限定divide_by只能取你代码里支持的合法值 keep divide_by in [1,2,4,8]; // 注意:你的代码里原有的16是4bit uint无法容纳的(4bit无符号最大是15),要么把divide_by改成uint(bits:5),要么去掉16的分支 keep align_by in [0..15]; // 根据寄存器实际需求调整范围 body()@driver.clock is { var div : uint(bits:3); case divide_by { 1 : { div = 0; }; 2 : { div = 1; }; 4 : { div = 2; }; 8 : { div = 3; }; default : { dut_error(divide_by," is not a legal Clock division for ADC"); }; }; gad_regs.gad_clk_gen.clk_algn = align_by; gad_regs.gad_clk_gen.clk_dev = div; do WR_REG seq keeping {.reg==gad_regs.gad_clk_gen;}; }; };
之后直接调用序列,就会自动按约束生成合法的十进制无符号值:
do CONFIG_ADC_CLK ocp_master_sequence_q;
三、给字段设置默认十进制值
如果希望字段有默认的初始值,可以在声明时直接初始化:
extend CONFIG_ADC_CLK ocp_master_sequence_q { divide_by : uint(bits:4) = 2; // 默认分配十进制值2 align_by : uint(bits:4) = 0; // 默认分配十进制值0 // ... 后续body代码保持不变 };
关键注意点
uint(bits:N)的取值范围是0到2^N - 1,比如uint(bits:4)最大只能到15,你原代码里的divide_by = 16会超出范围,要么调整bit宽度到uint(bits:5),要么移除16的分支,避免运行时错误。- 给uint类型分配十进制值时不需要额外转换,Specman会自动识别合法的十进制整数,只要值在字段的bit宽度范围内即可。
内容的提问来源于stack exchange,提问作者Sara p
相关产品推荐
相关产品推荐

