From c22d7f61f27bdab41ac73e47eebea382ea4bf508 Mon Sep 17 00:00:00 2001 From: Hiroo HAYASHI <24754036+hirooih@users.noreply.github.com> Date: Mon, 12 Oct 2020 23:51:45 +0900 Subject: [PATCH] Units,SystemVerilog: add parameter tests for #2537 --- .../systemverilog-parameter.d/args.ctags | 1 + .../systemverilog-parameter.d/expected.tags | 101 ++++++++++++++--- .../systemverilog-parameter.d/input.sv | 104 +++++++++++++++++- 3 files changed, 187 insertions(+), 19 deletions(-) diff --git a/Units/parser-verilog.r/systemverilog-parameter.d/args.ctags b/Units/parser-verilog.r/systemverilog-parameter.d/args.ctags index 5ee5f79f70..28d497ccaa 100644 --- a/Units/parser-verilog.r/systemverilog-parameter.d/args.ctags +++ b/Units/parser-verilog.r/systemverilog-parameter.d/args.ctags @@ -1 +1,2 @@ --sort=no +--fields-SystemVerilog=+{property} diff --git a/Units/parser-verilog.r/systemverilog-parameter.d/expected.tags b/Units/parser-verilog.r/systemverilog-parameter.d/expected.tags index c68e43cf35..1092cb6f76 100644 --- a/Units/parser-verilog.r/systemverilog-parameter.d/expected.tags +++ b/Units/parser-verilog.r/systemverilog-parameter.d/expected.tags @@ -1,16 +1,16 @@ C input.sv /^class C #($/;" C -p input.sv /^ int p = 1$/;" c class:C +p input.sv /^ int p = 1$/;" c class:C property:parameter q input.sv /^ parameter int q = 5; \/\/ local parameter$/;" c class:C t input.sv /^ static task t;$/;" t class:C p input.sv /^ int p;$/;" r task:C.t x input.sv /^ int x = C::p; \/\/ C::p disambiguates p$/;" r task:C.t C input.sv /^class C #($/;" C -p input.sv /^ int p = 1,$/;" c class:C -T input.sv /^ type T = int$/;" c class:C +p input.sv /^ int p = 1,$/;" c class:C property:parameter +T input.sv /^ type T = int$/;" c class:C property:parameter f input.sv /^function C::T C::f();$/;" f class:C.C C input.sv /^virtual class C#(parameter DECODE_W, parameter ENCODE_W = $clog2(DECODE_W));$/;" C class:C -DECODE_W input.sv /^virtual class C#(parameter DECODE_W, parameter ENCODE_W = $clog2(DECODE_W));$/;" c class:C.C -ENCODE_W input.sv /^virtual class C#(parameter DECODE_W, parameter ENCODE_W = $clog2(DECODE_W));$/;" c class:C.C +DECODE_W input.sv /^virtual class C#(parameter DECODE_W, parameter ENCODE_W = $clog2(DECODE_W));$/;" c class:C.C property:parameter +ENCODE_W input.sv /^virtual class C#(parameter DECODE_W, parameter ENCODE_W = $clog2(DECODE_W));$/;" c class:C.C property:parameter ENCODER_f input.sv /^ static function logic [ENCODE_W-1:0] ENCODER_f$/;" f class:C.C DecodeIn input.sv /^ (input logic [DECODE_W-1:0] DecodeIn);$/;" p function:C.C.ENCODER_f i input.sv /^ for (int i = 0; i < DECODE_W; i++) begin$/;" r function:C.C.ENCODER_f @@ -19,23 +19,23 @@ EncodeIn input.sv /^ (input logic [ENCODE_W-1:0] EncodeIn);$/;" p function: class input.sv /^interface class PutImp #(type PUT_T = logic); \/\/ FIXME$/;" I class input.sv /^interface class GetImp #(type GET_T = logic); \/\/ FIXME$/;" I interface:class Fifo input.sv /^class Fifo #(type T = logic, int DEPTH = 1) implements PutImp#(T), GetImp#(T);$/;" C interface:class.class -T input.sv /^class Fifo #(type T = logic, int DEPTH = 1) implements PutImp#(T), GetImp#(T);$/;" c class:class.class.Fifo -DEPTH input.sv /^class Fifo #(type T = logic, int DEPTH = 1) implements PutImp#(T), GetImp#(T);$/;" c class:class.class.Fifo +T input.sv /^class Fifo #(type T = logic, int DEPTH = 1) implements PutImp#(T), GetImp#(T);$/;" c class:class.class.Fifo property:parameter +DEPTH input.sv /^class Fifo #(type T = logic, int DEPTH = 1) implements PutImp#(T), GetImp#(T);$/;" c class:class.class.Fifo property:parameter myFifo input.sv /^ T myFifo[$:DEPTH-1];$/;" r class:class.class.Fifo -put input.sv /^ virtual function void put(T a); \/\/ FIXME : to be ignored$/;" f class:class.class.Fifo -a input.sv /^ virtual function void put(T a); \/\/ FIXME : to be ignored$/;" p function:class.class.Fifo.put -get input.sv /^ virtual function T get(); \/\/ FIXME : to be ignored$/;" f class:class.class.Fifo +put input.sv /^ virtual function void put(T a); \/\/ FIXME : to be ignored?$/;" f class:class.class.Fifo +a input.sv /^ virtual function void put(T a); \/\/ FIXME : to be ignored?$/;" p function:class.class.Fifo.put +get input.sv /^ virtual function T get(); \/\/ FIXME : to be ignored?$/;" f class:class.class.Fifo Stack input.sv /^class Stack #(type T = logic, int DEPTH = 1) implements PutImp#(T), GetImp#(T);$/;" C interface:class.class -T input.sv /^class Stack #(type T = logic, int DEPTH = 1) implements PutImp#(T), GetImp#(T);$/;" c class:class.class.Stack -DEPTH input.sv /^class Stack #(type T = logic, int DEPTH = 1) implements PutImp#(T), GetImp#(T);$/;" c class:class.class.Stack +T input.sv /^class Stack #(type T = logic, int DEPTH = 1) implements PutImp#(T), GetImp#(T);$/;" c class:class.class.Stack property:parameter +DEPTH input.sv /^class Stack #(type T = logic, int DEPTH = 1) implements PutImp#(T), GetImp#(T);$/;" c class:class.class.Stack property:parameter myFifo input.sv /^ T myFifo[$:DEPTH-1];$/;" r class:class.class.Stack put input.sv /^ virtual function void put(T a); \/\/ FIXME : to be ignored$/;" f class:class.class.Stack a input.sv /^ virtual function void put(T a); \/\/ FIXME : to be ignored$/;" p function:class.class.Stack.put get input.sv /^ virtual function T get(); \/\/ FIXME : to be ignored$/;" f class:class.class.Stack generic_fifo input.sv /^module generic_fifo$/;" m interface:class.class -MSB input.sv /^ #(parameter MSB=3, LSB=0, DEPTH=4) \/\/ these parameters can be redefined$/;" c module:class.class.generic_fifo -LSB input.sv /^ #(parameter MSB=3, LSB=0, DEPTH=4) \/\/ these parameters can be redefined$/;" c module:class.class.generic_fifo -DEPTH input.sv /^ #(parameter MSB=3, LSB=0, DEPTH=4) \/\/ these parameters can be redefined$/;" c module:class.class.generic_fifo +MSB input.sv /^ #(parameter MSB=3, LSB=0, DEPTH=4) \/\/ these parameters can be redefined$/;" c module:class.class.generic_fifo property:parameter +LSB input.sv /^ #(parameter MSB=3, LSB=0, DEPTH=4) \/\/ these parameters can be redefined$/;" c module:class.class.generic_fifo property:parameter +DEPTH input.sv /^ #(parameter MSB=3, LSB=0, DEPTH=4) \/\/ these parameters can be redefined$/;" c module:class.class.generic_fifo property:parameter in input.sv /^ (input wire [MSB:LSB] in,$/;" p module:class.class.generic_fifo clk input.sv /^ input wire clk, read, write, reset,$/;" p module:class.class.generic_fifo read input.sv /^ input wire clk, read, write, reset,$/;" p module:class.class.generic_fifo @@ -45,13 +45,80 @@ out input.sv /^ output logic [MSB:LSB] out,$/;" p module:class.class.generic_ full input.sv /^ output logic full, empty );$/;" p module:class.class.generic_fifo empty input.sv /^ output logic full, empty );$/;" p module:class.class.generic_fifo generic_decoder input.sv /^module generic_decoder$/;" m interface:class.class -num_code_bits input.sv /^ #(num_code_bits = 3, localparam num_out_bits = 1 << num_code_bits)$/;" c module:class.class.generic_decoder +num_code_bits input.sv /^ #(num_code_bits = 3, localparam num_out_bits = 1 << num_code_bits)$/;" c module:class.class.generic_decoder property:parameter num_out_bits input.sv /^ #(num_code_bits = 3, localparam num_out_bits = 1 << num_code_bits)$/;" c module:class.class.generic_decoder A input.sv /^ (input [num_code_bits-1:0] A, output reg [num_out_bits-1:0] Y);$/;" p module:class.class.generic_decoder Y input.sv /^ (input [num_code_bits-1:0] A, output reg [num_out_bits-1:0] Y);$/;" p module:class.class.generic_decoder int_t input.sv /^typedef int int_t;$/;" T interface:class.class user_defined_type_param input.sv /^module user_defined_type_param$/;" m interface:class.class -um_code_bits input.sv /^ #(int_t num_code_bits = 3, localparam num_out_bits = 1 << num_code_bits)$/;" c module:class.class.user_defined_type_param +um_code_bits input.sv /^ #(int_t num_code_bits = 3, localparam num_out_bits = 1 << num_code_bits)$/;" c module:class.class.user_defined_type_param property:parameter num_out_bits input.sv /^ #(int_t num_code_bits = 3, localparam num_out_bits = 1 << num_code_bits)$/;" c module:class.class.user_defined_type_param A input.sv /^ (input [num_code_bits-1:0] A, output reg [num_out_bits-1:0] Y);$/;" p module:class.class.user_defined_type_param Y input.sv /^ (input [num_code_bits-1:0] A, output reg [num_out_bits-1:0] Y);$/;" p module:class.class.user_defined_type_param +L1 input.sv /^parameter L1 = 0; \/\/ synonym for the localparam$/;" c interface:class.class property:parameter +module_with_parameter_port_list input.sv /^module module_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4/;" m interface:class.class +P1 input.sv /^module module_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4/;" c module:class.class.module_with_parameter_port_list property:parameter +P2 input.sv /^module module_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4/;" c module:class.class.module_with_parameter_port_list property:parameter +L2 input.sv /^module module_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4/;" c module:class.class.module_with_parameter_port_list +L3 input.sv /^module module_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4/;" c module:class.class.module_with_parameter_port_list +P3 input.sv /^module module_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4/;" c module:class.class.module_with_parameter_port_list property:parameter +P4 input.sv /^module module_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4/;" c module:class.class.module_with_parameter_port_list property:parameter +L4 input.sv /^ parameter L4 = "local parameter"; \/\/ synonym for the localparam$/;" c module:class.class.module_with_parameter_port_list +L5 input.sv /^ localparam L5 = "local parameter";$/;" c module:class.class.module_with_parameter_port_list +module_with_empty_parameter_port_list input.sv /^module module_with_empty_parameter_port_list #()$/;" m interface:class.class +L6 input.sv /^ parameter L6 = "local parameter"; \/\/ synonym for the localparam$/;" c module:class.class.module_with_empty_parameter_port_list +L7 input.sv /^ localparam L7 = "local parameter";$/;" c module:class.class.module_with_empty_parameter_port_list +module_no_parameter_port_list input.sv /^module module_no_parameter_port_list$/;" m interface:class.class +P5 input.sv /^ parameter P5 = "parameter";$/;" c module:class.class.module_no_parameter_port_list property:parameter +L8 input.sv /^ localparam L8 = "local parameter";$/;" c module:class.class.module_no_parameter_port_list +class_with_parameter_port_list input.sv /^class class_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4);$/;" C interface:class.class +P1 input.sv /^class class_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4);$/;" c class:class.class.class_with_parameter_port_list property:parameter +P2 input.sv /^class class_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4);$/;" c class:class.class.class_with_parameter_port_list property:parameter +L2 input.sv /^class class_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4);$/;" c class:class.class.class_with_parameter_port_list +L3 input.sv /^class class_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4);$/;" c class:class.class.class_with_parameter_port_list +P3 input.sv /^class class_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4);$/;" c class:class.class.class_with_parameter_port_list property:parameter +P4 input.sv /^class class_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4);$/;" c class:class.class.class_with_parameter_port_list property:parameter +L4 input.sv /^ parameter L4 = "local parameter"; \/\/ synonym for the localparam$/;" c class:class.class.class_with_parameter_port_list +L5 input.sv /^ localparam L5 = "local parameter";$/;" c class:class.class.class_with_parameter_port_list +class_with_empty_parameter_port_list input.sv /^class class_with_empty_parameter_port_list #();$/;" C interface:class.class +L6 input.sv /^ parameter L6 = "local parameter"; \/\/ synonym for the localparam$/;" c class:class.class.class_with_empty_parameter_port_list +L7 input.sv /^ localparam L7 = "local parameter";$/;" c class:class.class.class_with_empty_parameter_port_list +class_no_parameter_port_list input.sv /^class class_no_parameter_port_list;$/;" C interface:class.class +L8 input.sv /^ parameter L8 = "local parameter"; \/\/ synonym for the localparam (class only)$/;" c class:class.class.class_no_parameter_port_list +L9 input.sv /^ localparam L9 = "local parameter";$/;" c class:class.class.class_no_parameter_port_list +program_with_parameter_port_list input.sv /^program program_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, /;" P interface:class.class +P1 input.sv /^program program_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, /;" c program:class.class.program_with_parameter_port_list property:parameter +P2 input.sv /^program program_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, /;" c program:class.class.program_with_parameter_port_list property:parameter +L2 input.sv /^program program_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, /;" c program:class.class.program_with_parameter_port_list +L3 input.sv /^program program_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, /;" c program:class.class.program_with_parameter_port_list +P3 input.sv /^program program_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, /;" c program:class.class.program_with_parameter_port_list property:parameter +P4 input.sv /^program program_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, /;" c program:class.class.program_with_parameter_port_list property:parameter +L4 input.sv /^ parameter L4 = "local parameter"; \/\/ synonym for the localparam$/;" c program:class.class.program_with_parameter_port_list +L5 input.sv /^ localparam L5 = "local parameter";$/;" c program:class.class.program_with_parameter_port_list +program_with_empty_parameter_port_list input.sv /^program program_with_empty_parameter_port_list #()$/;" P interface:class.class +L6 input.sv /^ parameter L6 = "local parameter"; \/\/ synonym for the localparam$/;" c program:class.class.program_with_empty_parameter_port_list +L7 input.sv /^ localparam L7 = "local parameter";$/;" c program:class.class.program_with_empty_parameter_port_list +program_no_parameter_port_list input.sv /^program program_no_parameter_port_list$/;" P interface:class.class +P5 input.sv /^ parameter P5 = "parameter";$/;" c program:class.class.program_no_parameter_port_list property:parameter +L8 input.sv /^ localparam L8 = "local parameter";$/;" c program:class.class.program_no_parameter_port_list +interface_with_parameter_port_list input.sv /^interface interface_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter /;" I interface:class.class +P1 input.sv /^interface interface_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter /;" c interface:class.class.interface_with_parameter_port_list property:parameter +P2 input.sv /^interface interface_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter /;" c interface:class.class.interface_with_parameter_port_list property:parameter +L2 input.sv /^interface interface_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter /;" c interface:class.class.interface_with_parameter_port_list +L3 input.sv /^interface interface_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter /;" c interface:class.class.interface_with_parameter_port_list +P3 input.sv /^interface interface_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter /;" c interface:class.class.interface_with_parameter_port_list property:parameter +P4 input.sv /^interface interface_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter /;" c interface:class.class.interface_with_parameter_port_list property:parameter +L4 input.sv /^ parameter L4 = "local parameter"; \/\/ synonym for the localparam$/;" c interface:class.class.interface_with_parameter_port_list +L5 input.sv /^ localparam L5 = "local parameter";$/;" c interface:class.class.interface_with_parameter_port_list +interface_with_empty_parameter_port_list input.sv /^interface interface_with_empty_parameter_port_list #()$/;" I interface:class.class +L6 input.sv /^ parameter L6 = "local parameter"; \/\/ synonym for the localparam$/;" c interface:class.class.interface_with_empty_parameter_port_list +L7 input.sv /^ localparam L7 = "local parameter";$/;" c interface:class.class.interface_with_empty_parameter_port_list +interface_no_parameter_port_list input.sv /^interface interface_no_parameter_port_list$/;" I interface:class.class +P5 input.sv /^ parameter P5 = "parameter";$/;" c interface:class.class.interface_no_parameter_port_list property:parameter +L8 input.sv /^ localparam L8 = "local parameter";$/;" c interface:class.class.interface_no_parameter_port_list +package_has_no_parameter_port_list input.sv /^package package_has_no_parameter_port_list;$/;" K interface:class.class +L1 input.sv /^ parameter L1 = "local parameter";$/;" c package:class.class.package_has_no_parameter_port_list +L2 input.sv /^ localparam L2 = "local parameter";$/;" c package:class.class.package_has_no_parameter_port_list +generate_constructs input.sv /^module generate_constructs;$/;" m interface:class.class +L1 input.sv /^ parameter L1 = "local parameter"; \/\/ FIXME$/;" c module:class.class.generate_constructs property:parameter +L2 input.sv /^ localparam L2 = "local parameter";$/;" c module:class.class.generate_constructs diff --git a/Units/parser-verilog.r/systemverilog-parameter.d/input.sv b/Units/parser-verilog.r/systemverilog-parameter.d/input.sv index 0192315539..a9d95e01f3 100644 --- a/Units/parser-verilog.r/systemverilog-parameter.d/input.sv +++ b/Units/parser-verilog.r/systemverilog-parameter.d/input.sv @@ -55,10 +55,10 @@ endclass class Fifo #(type T = logic, int DEPTH = 1) implements PutImp#(T), GetImp#(T); T myFifo[$:DEPTH-1]; - virtual function void put(T a); // FIXME : to be ignored + virtual function void put(T a); // FIXME : to be ignored? myFifo.push_back(a); endfunction - virtual function T get(); // FIXME : to be ignored + virtual function T get(); // FIXME : to be ignored? get = myFifo.pop_front(); endfunction endclass @@ -94,3 +94,103 @@ module user_defined_type_param #(int_t num_code_bits = 3, localparam num_out_bits = 1 << num_code_bits) (input [num_code_bits-1:0] A, output reg [num_out_bits-1:0] Y); endmodule + +// +// LRM 6.20.1 Parameter declaration syntax (#2537) +// + +// compilation unit scope +parameter L1 = 0; // synonym for the localparam + +module module_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4) +( /*port list...*/ ); + parameter L4 = "local parameter"; // synonym for the localparam + localparam L5 = "local parameter"; + // ... +endmodule + +module module_with_empty_parameter_port_list #() +( /*port list...*/ ); + parameter L6 = "local parameter"; // synonym for the localparam + localparam L7 = "local parameter"; + // ... +endmodule + +module module_no_parameter_port_list +( /*port list...*/ ); + parameter P5 = "parameter"; + localparam L8 = "local parameter"; + // ... +endmodule + +class class_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4); + parameter L4 = "local parameter"; // synonym for the localparam + localparam L5 = "local parameter"; + // ... +endclass + +class class_with_empty_parameter_port_list #(); + parameter L6 = "local parameter"; // synonym for the localparam + localparam L7 = "local parameter"; + // ... +endclass + +class class_no_parameter_port_list; + parameter L8 = "local parameter"; // synonym for the localparam (class only) + localparam L9 = "local parameter"; + // ... +endclass + +program program_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4) +( /*port list...*/ ); + parameter L4 = "local parameter"; // synonym for the localparam + localparam L5 = "local parameter"; + // ... +endprogram + +program program_with_empty_parameter_port_list #() +( /*port list...*/ ); + parameter L6 = "local parameter"; // synonym for the localparam + localparam L7 = "local parameter"; + // ... +endprogram + +program program_no_parameter_port_list +( /*port list...*/ ); + parameter P5 = "parameter"; + localparam L8 = "local parameter"; + // ... +endprogram + +interface interface_with_parameter_port_list #(P1, P2, localparam L2 = P1+1, L3=P2*2, parameter P3, P4) +( /*port list...*/ ); + parameter L4 = "local parameter"; // synonym for the localparam + localparam L5 = "local parameter"; + // ... +endinterface + +interface interface_with_empty_parameter_port_list #() +( /*port list...*/ ); + parameter L6 = "local parameter"; // synonym for the localparam + localparam L7 = "local parameter"; + // ... +endinterface + +interface interface_no_parameter_port_list +( /*port list...*/ ); + parameter P5 = "parameter"; + localparam L8 = "local parameter"; + // ... +endinterface + +package package_has_no_parameter_port_list; + parameter L1 = "local parameter"; + localparam L2 = "local parameter"; +endpackage + +module generate_constructs; + generate + parameter L1 = "local parameter"; // FIXME + localparam L2 = "local parameter"; + endgenerate +endmodule