diff --git a/src/V3EmitV.cpp b/src/V3EmitV.cpp index 8aab51688..0cc600fab 100644 --- a/src/V3EmitV.cpp +++ b/src/V3EmitV.cpp @@ -235,6 +235,18 @@ class EmitVBaseVisitorConst VL_NOT_FINAL : public EmitCBaseVisitorConst { void visit(AstCoverInc*) override {} // N/A void visit(AstCoverToggle*) override {} // N/A + void visit(AstTestPlusArgs* nodep) override { + putfs(nodep, nodep->verilogKwd()); + putbs("("); + iterateChildrenConst(nodep); + puts(")"); + } + void visit(AstValuePlusArgs* nodep) override { + putfs(nodep, nodep->verilogKwd()); + putbs("("); + iterateChildrenConst(nodep); + puts(")"); + } void visitNodeDisplay(AstNode* nodep, AstNode* fileOrStrgp, const string& text, AstNode* exprsp) { putfs(nodep, nodep->verilogKwd()); @@ -476,7 +488,7 @@ class EmitVBaseVisitorConst VL_NOT_FINAL : public EmitCBaseVisitorConst { bool inPct = false; putbs(""); for (const char c : format) { - if (c == '%') { + if (!inPct && c == '%') { inPct = true; } else if (!inPct) { // Normal text string s; @@ -676,6 +688,13 @@ class EmitVBaseVisitorConst VL_NOT_FINAL : public EmitCBaseVisitorConst { iterateAndNextConstNull(nodep->itemsp()); puts("}"); } + void visit(AstEnumItemRef* nodep) override { + if (AstNodeModule* const classOrPackagep = nodep->classOrPackagep()) { + putfs(nodep, classOrPackagep->prettyName()); + puts("::"); + } + putfs(nodep, nodep->name()); + } void visit(AstEnumItem* nodep) override { putfs(nodep, nodep->name()); iterateConstNull(nodep->rangep()); diff --git a/test_regress/t/t_debug_emitv.out b/test_regress/t/t_debug_emitv.out index d7337c931..efa089909 100644 --- a/test_regress/t/t_debug_emitv.out +++ b/test_regress/t/t_debug_emitv.out @@ -23,10 +23,30 @@ module Vt_debug_emitv_t; union { logic a; } unu; + integer signed i1; int signed array[0:2]; initial begin array = '{0:32'sh1, 1:32'sh2, 2:32'sh3}; end + initial begin + begin + if ($test$plusargs(40'h48454c4c4f)) begin + $display("Hello argument found."); + end + if ((Pkg::FOO == 'sh0)) begin + $write(""); + end + if ((ZERO == 'sh0)) begin + $write(""); + end + if ($value$plusargs(56'h544553543d2564i1)) begin + $display("value was %~", i1); + end + else begin + $display("+TEST= not found"); + end + end + end bit [6:5] [4:3] [2:1] arraymanyd[10:11][12:13][14:15]; logic [15:0] pubflat; logic [15:0] pubflat_r; @@ -120,6 +140,8 @@ module Vt_debug_emitv_t; int signed sum; real r; string str; + int signed mod_val; + int signed mod_res; always @(posedge clk) begin begin cyc <= (cyc + 'sh1); @@ -240,6 +262,7 @@ module Vt_debug_emitv_t; $stop; end sub.r = 62.0; + mod_res = (mod_val % 'sh5); $display("%g", $log10(r)); $display("%g", $ln(r)); $display("%g", $exp(r)); @@ -308,4 +331,9 @@ package Vt_debug_emitv_p; endpackage package Vt_debug_emitv_Pkg; logic signed [31:0] PKG_PARAM; + typedef enum int signed{ + FOO = 32'h0, + BAR = 32'h1, + BAZ = 32'h2 + } enum_t; endpackage diff --git a/test_regress/t/t_debug_emitv.v b/test_regress/t/t_debug_emitv.v index 8c7ba061a..c6cad71ea 100644 --- a/test_regress/t/t_debug_emitv.v +++ b/test_regress/t/t_debug_emitv.v @@ -7,6 +7,12 @@ package Pkg; localparam PKG_PARAM = 1; + + typedef enum int { + FOO = 0, + BAR, + BAZ + } enum_t; endpackage package PkgImp; import Pkg::*; @@ -52,8 +58,18 @@ module t (/*AUTOARG*/ us_t us; union_t unu; + integer i1; int array[3]; initial array = '{1,2,3}; + initial begin + if ($test$plusargs("HELLO")) $display("Hello argument found."); + if (Pkg::FOO == 0) $write(""); + if (ZERO == 0) $write(""); + if ($value$plusargs("TEST=%d", i1)) + $display("value was %d", i1); + else + $display("+TEST= not found"); + end bit [6:5][4:3][2:1] arraymanyd[10:11][12:13][14:15]; @@ -125,6 +141,8 @@ module t (/*AUTOARG*/ int sum; real r; string str; + int mod_val; + int mod_res; always_ff @ (posedge clk) begin cyc <= cyc + 1; r <= r + 0.01; @@ -195,6 +213,8 @@ module t (/*AUTOARG*/ if (Pkg::PKG_PARAM != 1) $stop; sub.r = 62.0; + mod_res = mod_val % 5; + $display("%g", $log10(r)); $display("%g", $ln(r)); $display("%g", $exp(r));