我试图让我的测试平台更具可扩展性,并且需要一组需要实例路径名的PLI函数。我试图避免不得不硬化那条道路。我可以使用$sformat
/ $sformatf
系统任务/函数构建路径。我尝试将路径定义为SystemVerilog string
类型,但PLI拒绝它,我无法更改PLI。 PLI确实接受了一个reg数组。
挑战是PLI需要左对齐文本,但$sformat
,$sformatf
和%s
都是正确的。
left-justified : "tb.vdut[10].inst9.sample_func " // Desired right-justified : " tb.vdut[10].inst9.sample_func" // Actual
示例功能:
function void call(
integer dut_id, inst_id,
reg [CHAR_NUM-1:0] func_name,
integer arg0, arg1, argN );
reg [CHAR_NUM-1:0] path;
$sformat(path,"tb.vdut[%0d].inst%0d.%0s", dut_id, inst_id, func_name );
// Make path left-justified
/* missing convert code here */
$display("path:'%s', arg0:%0d, arg1:%0d, argN:%0d", path, arg0, arg1, argN );
//$my_pli( path, arg0, arg1, argN );
endfunction : call
我有自己的答案,但我正在寻找更清洁的解决方案。如果CHANR_NUM
很大并且函数call
经常执行,则while循环会占用大量CPU时间。
答案 0 :(得分:0)
我能够通过while循环将右对齐转换为左对齐。
while(path[CHAR_NUM-1 -: 8] == " ") path <<= 8;
限制:CHANR_NUM
很大且经常执行函数call
时额外的CPU开销。
当前解决方案:
function void call(
integer dut_id, inst_id,
reg [CHAR_NUM-1:0] func_name,
integer arg0, arg1, argN );
reg [CHAR_NUM-1:0] path;
$sformat(path,"tb.vdut[%0d].inst%0d.%0s", dut_id, inst_id, func_name );
// Make path left-justified
while(path[CHAR_NUM-1 -: 8] == " ") path <<= 8;
$display("path:'%s', arg0:%0d, arg1:%0d, argN:%0d", path, arg0, arg1, argN );
//$my_pli( path, arg0, arg1, argN );
endfunction : call
答案 1 :(得分:0)
寻找其他解决方案。首先为格式字符串创建一个参数。使用参数进行格式评估仅在编译/精化时发生,在模拟过程中它将是静态的。
parameter FORMAT_LJUSTIFY = $sformatf("%%-%0ds",CHAR_NUM/8);
因此,如果CHAR_NUM
为640,那么FORMAT_LJUSTIFY
将为"%-80s"
,这意味着最后80个字符将被左对齐。
然后使用$sformat(path, FORMAT_LJUSTIFY, path);
。建议对$sformat
使用$sformatf
和reg数组。一些模拟器$sformatf
作为右对齐,其他模拟器不会编译,除非我进行类型转换。类型转换工作,但它是额外的。
约束:如果path
的宽度必须为CHAR_NUM
,则会有前导和尾随空白字符或限制字符。
function void call(
integer dut_id, inst_id,
reg [CHAR_NUM-1:0] func_name,
integer arg0, arg1, argN );
reg [CHAR_NUM-1:0] path;
$sformat(path,"tb.vdut[%0d].inst%0d.%0s", dut_id, inst_id, func_name );
// Make path left-justified
$sformat(path, FORMAT_LJUSTIFY, path);
$display("path:'%s', arg0:%0d, arg1:%0d, argN:%0d", path, arg0, arg1, argN );
//$my_pli( path, arg0, arg1, argN );
endfunction : call