使用三元运算符调用SystemVerilog函数为何出现语法错误?
SystemVerilog三元运算符调用$display报错问题解析
报错原因
SystemVerilog的三元运算符(?:)属于表达式范畴,而非语句。它要求?和:两侧的操作必须是能返回同类型有效值的表达式。但$display是系统任务(task),任务的设计目的是执行操作,不会返回任何值,根本满足不了三元运算符对操作数的要求,因此编译器会抛出语法错误。
而第二个语句$display("%0d", b > a ? b : a);能正常运行,是因为这里的三元运算符是用来返回一个整数值(b或a),作为$display的输入参数,完全符合表达式的使用规则。
解决方法
要实现条件选择执行不同的$display,最合规也最易读的方式是使用if-else语句:
module tb; int a = 1, b = 4; initial begin if (b > a) begin $display("%0d", b); end else begin $display("Value: %0d", a); end $display("%0d", b > a ? b : a); // 此语句正常运行 end endmodule
如果非要用类似三元的写法(不推荐,可读性差),可以把$display包装成返回哑值的函数,让三元运算符能合法调用:
module tb; int a = 1, b = 4; function int disp_b(); $display("%0d", b); return 0; // 返回任意哑值满足函数返回要求 endfunction function int disp_a(); $display("Value: %0d", a); return 0; endfunction initial begin b > a ? disp_b() : disp_a(); // 现在合法,函数返回值符合表达式要求 $display("%0d", b > a ? b : a); end endmodule
但这种写法纯属技巧性操作,实际工程中优先用if-else,代码可读性和维护性更好。
内容的提问来源于stack exchange,提问作者Taher Anaya
相关产品推荐
相关产品推荐

