在我的Verilog代码中,我有这样的语句
$display(" %s r%h, r%h",
instrH == ALU8_ADD ? "add" :
instrH == ALU8_ADC ? "adc" :
instrH == ALU8_SUB ? "sub" :
instrH == ALU8_SBC ? "sbc" :
instrH == ALU8_OR ? "or" :
instrH == ALU8_AND ? "and" :
instrH == ALU8_TCM ? "tcm" :
instrH == ALU8_TM ? "tm" :
instrH == ALU8_CP ? "cp" :
instrH == ALU8_XOR ? "xor" : "?",
secondH, secondL);
这对于测试台调试日志记录很有帮助。我想提取这部分
instrH == ALU8_ADD ? "add" :
instrH == ALU8_ADC ? "adc" :
instrH == ALU8_SUB ? "sub" :
instrH == ALU8_SBC ? "sbc" :
instrH == ALU8_OR ? "or" :
instrH == ALU8_AND ? "and" :
instrH == ALU8_TCM ? "tcm" :
instrH == ALU8_TM ? "tm" :
instrH == ALU8_CP ? "cp" :
instrH == ALU8_XOR ? "xor" : "?",
进入某种“函数”,所以这只是在一个位置定义并稍后使用它,类似于:
$display(" %s r%h, r%h",
alu8OpName(instrH),
secondH, secondL);
如何定义一个返回字符串的函数?
您可以声明一个返回
function
类型的 string
。请参阅 IEEE Std 1800-2017,第 13.4 节功能。这需要您在模拟器中启用 SystemVerilog 功能。
这是一个可运行的示例:
module tb;
function string alu8OpName (int instrH);
case (instrH)
0 : return "add" ;
1 : return "adc" ;
2 : return "sub" ;
3 : return "sbc" ;
4 : return "or" ;
5 : return "and" ;
6 : return "tcm" ;
7 : return "tm" ;
8 : return "cp" ;
9 : return "xor" ;
default : return "?" ;
endcase
endfunction
initial begin
$display(" %s", alu8OpName(5));
$display(" %s", alu8OpName(8));
$display(" %s", alu8OpName(33));
end
endmodule
输出:
and
cp
?
您可以使用代码所示的条件运算符,或使用
case
语句代替。