SystemVerilog中格式化输出域宽如何设置
在使用$display等方法格式化显示数据时,经常需要指定显示数据的对齐方式,一般情况下会在百分号(%)和指定基数之间通过指定域宽(field width)实现要显示数据的对齐格式。本文将示例field width在格式化显示中的使用方法。
1 设置域宽值的格式如下:
2 在百分号(%)和指定的基数字母之间不指定域宽的情况
【示例】 【仿真结果】
示例中din为32位,赋值为’d12,在没有指定域宽时,din的十进制显示为“ 12”,十六进制显示为“0000000C”。这是因为按照指定格式不设置有域宽显示数据时,采用的是默认域宽,在默认域宽情况下会按照所要显示数据所能表示的最大域宽进行对齐。示例中的din为32位,按照十进制显示时能表示的最大的十进制数是232-1,即4294967296,共十个字符位,所以在现实完了要显示的有效数据12后,还有8个字符的空位需要用空格向左补齐。din按照十六进制显示时,能表示的最大的十六进制数是FFFFFFFF,共8个字符,所以在显示完了有效数据12(即C)之后,还有7个字符的空位需要用0向左补齐。这里需要注意,如果按照十进制显示,那么向左补齐采用的是空格不是0,采用其他数制字母的按照0进行补齐。
3 在百分号(%)和指定的基数字母之间指定域宽大于实际要显示字符个数的情况
【示例】 【仿真结果】
示例中din为32位,赋值为’d12,指定域宽为4,din的十进制显示为“ 12”,十六进制显示为“000C”。示例中din按照十进制显示时,指定域宽为4个字符,此时显示的数据只占用了2个字符的宽度,小于指定域宽值4,所以此时显示12后还有2个字符的空位需要用空格向左补齐。din按照十六进制显示时,指定域宽为4个字符,此时显示的数据只占用了1个字符的宽度,还有3个字符的空位需要用0向左补齐。可见,当设置的域宽值大于要显示的数据实际宽度时,将按照设置的域宽值进行显示,在要显示数据左侧补齐空格(十进制格式或者字符串格式)或者0(非十进制格式或者字符串格式)直到显示宽度满足设置域宽值。
4 在百分号(%)和指定的基数字母之间指定域宽小于等于实际要显示字符个数的情况
【示例】 【仿真结果】
示例中din为32位,赋值为’d123456,指定域宽为4,din的十进制显示为“123456”,十六进制显示为“1e240”。示例中din按照十进制显示时,指定域宽为4个字符,此时显示的数据实际需要使用6个字符的宽度,大于设定的域宽4,此时显示数据将按照实际数据占用字符数显示,不受设定的域宽值影响。din按照十六进制显示时,指定域宽为4个字符,此时显示的数据实际需要使用5个字符的宽度,大于设定的域宽4,此时显示数据将按照实际数据占用字符数显示,也不受设定的域宽值影响。可见,当设置的域宽值小于等于要显示数据的实际宽度时,将按照数据实际宽度进行显示,不会进行补零或者空格的操作。
5 设置域宽值为负值
【示例】 【仿真结果】
示例中,在指定域宽时使用了负值,此时数据显示将按照左对齐的方式对数据右侧进行补位操作,具体补位过程与使用正数类似,这里不管十进制还是十六进制都采用了空格进行补位,但是实际上在IEEE1800中约定域宽值只能设置为正数,所以关于负值域宽可能会存在不同仿真工具处理不一致的情况,安全起见,建议大家使用正数域宽值。
通过上述示例,在格式化输出时设置域宽的规则如下:
Ø 在百分号(%)和指定的基数字母之间不指定域宽时,采用的是默认域宽,在默认域宽情况下会按照所要显示数据所能表示的最大域宽进行对齐,如果按照十进制显示,那么向左补齐采用的是空格不是0,采用其他数制字母的按照0进行补齐。
Ø 在百分号(%)和指定的基数字母之间指定域宽大于实际要显示字符个数时,将按照设置的域宽值进行显示,在要显示数据左侧补齐空格(十进制格式或者字符串格式)或者0(非十进制格式或者字符串格式)直到显示宽度满足设置域宽值;
Ø 在百分号(%)和指定的基数字母之间指定域宽小于等于实际要显示字符个数时,将按照数据实际宽度进行显示,不会进行补零或者空格的操作;
Ø 建议不使用负值域宽设置;
通过上述示例,在格式化输出时设置域宽的规则如下:
Ø 在百分号(%)和指定的基数字母之间不指定域宽时,采用的是默认域宽,在默认域宽情况下会按照所要显示数据所能表示的最大域宽进行对齐,如果按照十进制显示,那么向左补齐采用的是空格不是0,采用其他数制字母的按照0进行补齐。
Ø 在百分号(%)和指定的基数字母之间指定域宽大于实际要显示字符个数时,将按照设置的域宽值进行显示,在要显示数据左侧补齐空格(十进制格式或者字符串格式)或者0(非十进制格式或者字符串格式)直到显示宽度满足设置域宽值;
Ø 在百分号(%)和指定的基数字母之间指定域宽小于等于实际要显示字符个数时,将按照数据实际宽度进行显示,不会进行补零或者空格的操作;
Ø 建议不使用负值域宽设置;