在搭建仿真测试环境时,经常用$display显示一些信息用于辅助定位问题和调试,但是在具体是用$display时,经常会因为设置不当或者格式说明符使用不对,导致显示输出结果与期望不一致。为此,下面将示例说明$display的一些使用方法。
首先,$display的使用格式如下:
$display(p1,p2,...,pn);
一般情况下,将p2到pn按照p1指定的格式输出,p1一般用于描述输出格式,但是$display实际上在使用时也可以不指定格式输出。
1 $display自动换行
在SystemVerilog与Verilog中,$display和$write都可以用于显示信息,但是实际上两者还是存在不同的。$display可以在显示完相关信息后自动换行,而$write则不会。如果要使用$write和$display一样的功能,那么需要在$write输出信息的最后额外加上转义符号“ ”从而实现换行。
【示例】
【仿真结果】
通过仿真结果可以看出,在使用$display时,其中的信息输出后会自动进行换行操作,不需要额外使用“ ”进行换行,但是$write需要额外使用“ ”进行换行,否则其输出消息后不会进行换行操作。其实在实际使用的过程中,也可以使用两个函数的各自特点,进行一些特殊的操作:可以使用$display不添加任何参数的情况下,实现换行操作;$write不增加任何参数可以实现一个空格的输出。
2 特殊数据结构不指定输出格式显示
在SystemVerilog和Verilog中,目前不支持通过$display直接输出显示upacked array,unpacked struct和union等类型的数据,但是对于packed的这些类型还是可以通过$display直接输出显示的。
【示例】
【仿真结果】
因为输出的数据没有指定具体的输出格式,所以输出时将会按照数据的存储方式进行输出。示例中采用的packed方式顺序存放数据,即“2’b10,2’b01,2’b11”,所以此时输出的数据将会按照十进制的格式显示出来,即显示为十进制的39。示例中非packed struct是不能直接用$display输出,否则仿真器会报错。
【示例】
【仿真结果】
示例中,在1st中因为设置的格式描述符中数据格式与要输出的结构体中元素个数相同,所以结构体中所有元素按照设置格式正常显示了出来;在2nd中,格式描述符中仅设置了一个,而在$display后续的参数中却列出了三个参数需要输出,最终仿真结果显示结果为:第一个显示的数据按照指定格式输出值,其值为期望的“’h12”,但是紧接着第一个输出结果后的两个输出并不是期望的的“’h34”和“’h56”,这是为什么呢?在3rd中显示的结果与2nd中的结果类似,也是按照指定格式符格式显示了第一个参数后,后续的结果与期望的不一致。在2nd和3rd中,两个$display有一个共同点是:$display中设置的格式符的个数比要显示的结构体元素个数少,并且仅有排在参数列表前部的元素,按照格式符个数与要求输出,其他元素的输出均与期望不一致。在4th中,当格式符格式与要输出结构体元素个数相同时,此时输出的值与期望的“’h56”一致。
其实上例中的仿真结果实际上是一种正确的结果,只是输出形式跟预期有所差异。在SystemVerilog和Verilog中,$display中要输出的元素如果没有制定对应的格式符,那么这些元素默认按照十进制的方式输出。示例中,2nd和3rd格式符的个数均少于要显示的元素的个数,此时按照格式符指定的格式显示的元素的个数与格式符个数相同,并且按照先后顺序依次取自要显示的元素列表。
同时需要注意,如果使用$display显示数据没有指定输出数据格式,那么显示的数据默认按照十进制格式输出,如果期望默认值为八进制可以使用$displayo,期望默认值为十六进制可以使用$displayh,$write与$display行为类似,就不再赘述。
更多技术内容,可关注下图个人技术微信公众号,欢迎朋友们关注沟通!