{
  "name": "SystemVerilog",
  "scopeName": "source.systemverilog",
  "fileTypes": [
    "v",
    "vh",
    "sv",
    "svh"
  ],
  "patterns": [
    {
      "include": "#comments"
    },
    {
      "include": "#strings"
    },
    {
      "include": "#parameter"
    },
    {
      "include": "#port-declaration"
    },
    {
      "include": "#module-declaration"
    },
    {
      "include": "#class-declaration"
    },
    {
      "include": "#function-task"
    },
    {
      "include": "#sequence"
    },
    {
      "include": "#keywords"
    },
    {
      "include": "#all-types"
    },
    {
      "include": "#module-parameters"
    },
    {
      "include": "#module-no-parameters"
    },
    {
      "include": "#system-tf"
    },
    {
      "include": "#typedef-complex"
    },
    {
      "include": "#typedef-simple"
    },
    {
      "include": "#assertion"
    },
    {
      "include": "#bind-directive"
    },
    {
      "include": "#cast-operator"
    },
    {
      "include": "#storage-scope"
    },
    {
      "include": "#attributes"
    },
    {
      "include": "#imports"
    },
    {
      "include": "#operators"
    },
    {
      "include": "#constants"
    },
    {
      "include": "#functions"
    },
    {
      "include": "#identifiers"
    },
    {
      "include": "#selects"
    }
  ],
  "repository": {
    "function-task": {
      "begin": "[ \\t\\n]*(?:\\b(virtual)[ \\t\\n]+)?(?:\\b(function|task)\\b)(?:[ \\t\\n]+\\b(static|automatic)\\b)?",
      "beginCaptures": {
        "1": {
          "name": "storage.modifier.systemverilog"
        },
        "2": {
          "name": "storage.type.function.systemverilog"
        },
        "3": {
          "name": "storage.modifier.systemverilog"
        }
      },
      "end": ";",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.function.end.systemverilog"
        }
      },
      "patterns": [
        {
          "match": "\\b([a-zA-Z_][a-zA-Z0-9_$]*[ \\t\\n]+)?([a-zA-Z_][a-zA-Z0-9_:]*)[ \\t\\n]*(?=\\(|;)",
          "captures": {
            "1": {
              "name": "storage.type.systemverilog"
            },
            "2": {
              "name": "entity.name.function.systemverilog"
            }
          }
        },
        {
          "include": "#port-declaration"
        },
        {
          "include": "#keywords"
        },
        {
          "include": "#base-grammar"
        },
        {
          "include": "#identifiers"
        }
      ],
      "name": "meta.function.systemverilog"
    },
    "typedef-complex": {
      "begin": "[ \\t\\n]*\\b(typedef)[ \\t\\n]+(enum|struct|union|class|interface[ \\t\\n]+class)(?:[ \\t\\n]+(packed))?(?:[ \\t\\n]+([a-zA-Z_][a-zA-Z0-9_$]*)(?=[ \\t\\n]*(\\[[a-zA-Z0-9_:$\\-\\+` \\t\\n\\[\\]]*\\])?))?(?=[ \\t\\n]*{)",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.systemverilog"
        },
        "2": {
          "name": "keyword.control.systemverilog"
        },
        "3": {
          "name": "keyword.control.systemverilog"
        },
        "4": {
          "name": "storage.type.systemverilog"
        }
      },
      "end": "(?<=})(?:[ \\t\\n]*([a-zA-Z_][a-zA-Z0-9_$]*))(?:[ \\t\\n]*(\\[[a-zA-Z0-9_:$\\-\\+` \\t\\n\\[\\]]*\\])?)[ \\t\\n]*;",
      "endCaptures": {
        "1": {
          "name": "storage.type.systemverilog"
        },
        "2": {
          "patterns": [
            {
              "include": "#selects"
            }
          ]
        }
      },
      "patterns": [
        {
          "include": "#keywords"
        },
        {
          "include": "#base-grammar"
        },
        {
          "include": "#identifiers"
        }
      ],
      "name": "meta.typedef.complex.systemverilog"
    },
    "typedef-simple": {
      "begin": "[ \\t\\n]*\\b(typedef)[ \\t\\n]+(enum|struct|union|class|interface[ \\t\\n]+class)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.systemverilog"
        },
        "2": {
          "name": "keyword.control.systemverilog"
        }
      },
      "end": "(?:[ \\t\\n]*([a-zA-Z_][a-zA-Z0-9_$]*))(?:[ \\t\\n]*(\\[[a-zA-Z0-9_:$\\-\\+` \\t\\n\\[\\]]*\\])?)[ \\t\\n]*;",
      "endCaptures": {
        "1": {
          "name": "storage.type.systemverilog"
        },
        "2": {
          "patterns": [
            {
              "include": "#selects"
            }
          ]
        }
      },
      "patterns": [
        {
          "match": "[ \\t\\n]+\\b([a-zA-Z_][a-zA-Z0-9_$]*)[ \\t\\n]*(#)\\(",
          "captures": {
            "1": {
              "name": "storage.type.userdefined.systemverilog"
            },
            "2": {
              "name": "keyword.operator.param.systemverilog"
            }
          },
          "name": "meta.typedef.class.systemverilog"
        },
        {
          "include": "#base-grammar"
        },
        {
          "include": "#module-binding"
        },
        {
          "include": "#identifiers"
        }
      ],
      "name": "meta.typedef.simple.systemverilog"
    },
    "module-declaration": {
      "begin": "[ \\t\\n]*\\b((?:macro)?module|interface|program|package)[ \\t\\n]+(?:(static|automatic)[ \\t\\n]+)?([a-zA-Z_][a-zA-Z0-9_$]*)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.systemverilog"
        },
        "2": {
          "name": "storage.modifier.systemverilog"
        },
        "3": {
          "name": "entity.name.type.module.systemverilog"
        }
      },
      "end": ";",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.module.end.systemverilog"
        }
      },
      "patterns": [
        {
          "include": "#parameter"
        },
        {
          "include": "#port-declaration"
        },
        {
          "include": "#interface-port"
        },
        {
          "include": "#imports"
        },
        {
          "include": "#base-grammar"
        },
        {
          "include": "#identifiers"
        }
      ],
      "name": "meta.module.systemverilog"
    },
    "sequence": {
      "match": "[ \\t\\n]*\\b(sequence)[ \\t\\n]+([a-zA-Z_][a-zA-Z0-9_$]*)\\b",
      "captures": {
        "1": {
          "name": "keyword.control.systemverilog"
        },
        "2": {
          "name": "entity.name.function.systemverilog"
        }
      },
      "name": "meta.sequence.systemverilog"
    },
    "bind-directive": {
      "match": "[ \\t\\n]*\\b(bind)[ \\t\\n]+([a-zA-Z_][a-zA-Z0-9_$\\.]*)\\b",
      "captures": {
        "1": {
          "name": "keyword.control.systemverilog"
        },
        "2": {
          "name": "entity.name.type.module.systemverilog"
        }
      },
      "name": "meta.definition.systemverilog"
    },
    "assertion": {
      "match": "\\b([a-zA-Z_][a-zA-Z0-9_$]*)[ \\t\\n]*(:)[ \\t\\n]*(assert|assume|cover|restrict)\\b",
      "captures": {
        "1": {
          "name": "entity.name.goto-label.php"
        },
        "2": {
          "name": "keyword.operator.systemverilog"
        },
        "3": {
          "name": "keyword.sva.systemverilog"
        }
      }
    },
    "compiler-directives": {
      "patterns": [
        {
          "match": "(`)(else|endif|endcelldefine|celldefine|nounconnected_drive|resetall|undefineall|end_keywords|__FILE__|__LINE__)\\b",
          "captures": {
            "1": {
              "name": "punctuation.definition.directive.systemverilog"
            },
            "2": {
              "name": "string.regexp.systemverilog"
            }
          }
        },
        {
          "match": "(`)(ifdef|ifndef|elsif|define|undef|pragma)[ \\t\\n]+([a-zA-Z_][a-zA-Z0-9_$]*)\\b",
          "captures": {
            "1": {
              "name": "punctuation.definition.directive.systemverilog"
            },
            "2": {
              "name": "string.regexp.systemverilog"
            },
            "3": {
              "name": "entity.name.function.preprocessor.systemverilog"
            }
          }
        },
        {
          "match": "(`)(include|timescale|default_nettype|unconnected_drive|line|begin_keywords)\\b",
          "captures": {
            "1": {
              "name": "punctuation.definition.directive.systemverilog"
            },
            "2": {
              "name": "string.regexp.systemverilog"
            }
          }
        },
        {
          "match": "(`)([a-zA-Z_][a-zA-Z0-9_$]*)\\b",
          "captures": {
            "1": {
              "name": "punctuation.definition.directive.systemverilog"
            },
            "2": {
              "name": "entity.name.function.preprocessor.systemverilog"
            }
          }
        }
      ],
      "name": "meta.preprocessor.systemverilog"
    },
    "keywords": {
      "patterns": [
        {
          "match": "\\b(edge|negedge|posedge|cell|config|deassign|defparam|design|disable|endgenerate|endspecify|endtable|event|generate|genvar|ifnone|incdir|instance|liblist|library|noshowcancelled|pulsestyle_onevent|pulsestyle_ondetect|scalared|showcancelled|specify|specparam|table|use|vectored)\\b",
          "captures": {
            "1": {
              "name": "keyword.other.systemverilog"
            }
          }
        },
        {
          "include": "#sv-control"
        },
        {
          "include": "#sv-control-begin"
        },
        {
          "include": "#sv-control-end"
        },
        {
          "include": "#sv-definition"
        },
        {
          "include": "#sv-cover-cross"
        },
        {
          "include": "#sv-std"
        },
        {
          "include": "#sv-option"
        },
        {
          "include": "#sv-local"
        },
        {
          "include": "#sv-rand"
        },
        {
          "include": "#sv-support"
        }
      ]
    },
    "sv-control": {
      "match": "[ \\t\\n]*\\b(initial|wait|force|release|assign|always|always_comb|always_ff|always_latch|forever|repeat|while|for|if|iff|else|case|casex|casez|default|endcase|return|break|continue|do|foreach|with|clocking|coverpoint|property|bins|binsof|illegal_bins|ignore_bins|randcase|modport|matches|solve|before|expect|cross|ref|first_match|srandom|struct|packed|final|chandle|alias|tagged|extern|throughout|timeprecision|timeunit|priority|type|union|uwire|wait_order|triggered|randsequence|context|pure|intersect|wildcard|typedef|new|forkjoin|unique|unique0|priority)\\b",
      "captures": {
        "1": {
          "name": "keyword.control.systemverilog"
        }
      }
    },
    "sv-control-begin": {
      "match": "[ \\t\\n]*\\b(begin|fork)\\b(?:[ \\t\\n]*(:)[ \\t\\n]*([a-zA-Z_][a-zA-Z0-9_$]*))?",
      "captures": {
        "1": {
          "name": "keyword.control.systemverilog"
        },
        "2": {
          "name": "punctuation.definition.label.systemverilog"
        },
        "3": {
          "name": "entity.name.section.systemverilog"
        }
      },
      "name": "meta.item.begin.systemverilog"
    },
    "sv-control-end": {
      "match": "[ \\t\\n]*\\b(end|endmodule|endinterface|endprogram|endchecker|endclass|endpackage|endconfig|endfunction|endtask|endproperty|endsequence|endgroup|endprimitive|endclocking|join|join_any|join_none)\\b(?:[ \\t\\n]*(:)[ \\t\\n]*([a-zA-Z_][a-zA-Z0-9_$]*))?",
      "captures": {
        "1": {
          "name": "keyword.control.systemverilog"
        },
        "2": {
          "name": "punctuation.definition.label.systemverilog"
        },
        "3": {
          "name": "entity.name.section.systemverilog"
        }
      },
      "name": "meta.item.end.systemverilog"
    },
    "sv-std": {
      "match": "\\b(std)\\b::",
      "name": "support.class.systemverilog"
    },
    "sv-definition": {
      "match": "[ \\t\\n]*\\b(primitive|package|constraint|interface|covergroup|program)[ \\t\\n]+\\b([a-zA-Z_][a-zA-Z0-9_$]*)\\b",
      "captures": {
        "1": {
          "name": "keyword.control.systemverilog"
        },
        "2": {
          "name": "entity.name.type.class.systemverilog"
        }
      },
      "name": "meta.definition.systemverilog"
    },
    "sv-cover-cross": {
      "match": "(([a-zA-Z_][a-zA-Z0-9_$]*)[ \\t\\n]*(:))?[ \\t\\n]*(coverpoint|cross)[ \\t\\n]+([a-zA-Z_][a-zA-Z0-9_$]*)",
      "captures": {
        "2": {
          "name": "entity.name.type.class.systemverilog"
        },
        "3": {
          "name": "keyword.operator.other.systemverilog"
        },
        "4": {
          "name": "keyword.control.systemverilog"
        }
      },
      "name": "meta.definition.systemverilog"
    },
    "class-declaration": {
      "begin": "[ \\t\\n]*\\b(virtual[ \\t\\n]+)?(class)(?:[ \\t\\n]+(static|automatic))?[ \\t\\n]+([a-zA-Z_][a-zA-Z0-9_$:]*)(?:[ \\t\\n]+(extends|implements)[ \\t\\n]+([a-zA-Z_][a-zA-Z0-9_$:]*))?",
      "beginCaptures": {
        "1": {
          "name": "storage.modifier.systemverilog"
        },
        "2": {
          "name": "storage.type.class.systemverilog"
        },
        "3": {
          "name": "storage.modifier.systemverilog"
        },
        "4": {
          "name": "entity.name.type.class.systemverilog"
        },
        "5": {
          "name": "keyword.control.systemverilog"
        },
        "6": {
          "name": "entity.name.type.class.systemverilog"
        }
      },
      "end": ";",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.class.end.systemverilog"
        }
      },
      "patterns": [
        {
          "match": "[ \\t\\n]+\\b(extends|implements)[ \\t\\n]+([a-zA-Z_][a-zA-Z0-9_$:]*)(?:[ \\t\\n]*,[ \\t\\n]*([a-zA-Z_][a-zA-Z0-9_$:]*))*",
          "captures": {
            "1": {
              "name": "keyword.control.systemverilog"
            },
            "2": {
              "name": "entity.name.type.class.systemverilog"
            },
            "3": {
              "name": "entity.name.type.class.systemverilog"
            }
          }
        },
        {
          "match": "[ \\t\\n]+\\b([a-zA-Z_][a-zA-Z0-9_$]*)[ \\t\\n]*(#)\\(",
          "captures": {
            "1": {
              "name": "storage.type.userdefined.systemverilog"
            },
            "2": {
              "name": "keyword.operator.param.systemverilog"
            }
          },
          "name": "meta.typedef.class.systemverilog"
        },
        {
          "include": "#parameter"
        },
        {
          "include": "#port-declaration"
        },
        {
          "include": "#interface-port"
        },
        {
          "include": "#base-grammar"
        },
        {
          "include": "#module-binding"
        },
        {
          "include": "#identifiers"
        }
      ],
      "name": "meta.class.systemverilog"
    },
    "sv-support": {
      "match": "\\b(and|nand|nor|or|xor|xnor|buf|not|bufif[01]|notif[01]|r?[npc]mos|tran|r?tranif[01]|pullup|pulldown)\\b",
      "name": "support.type.systemverilog"
    },
    "system-tf": {
      "match": "\\$[a-zA-Z0-9_$][a-zA-Z0-9_$]*\\b",
      "name": "support.function.systemverilog"
    },
    "cast-operator": {
      "match": "[ \\t\\n]*([a-zA-Z_][a-zA-Z0-9_$]*)(')(?=\\()",
      "captures": {
        "1": {
          "name": "storage.type.interface.systemverilog"
        },
        "2": {
          "name": "keyword.operator.cast.systemverilog"
        }
      },
      "name": "meta.cast.systemverilog"
    },
    "parameter": {
      "match": "[ \\t\\n]*(localparam|parameter)[ \\t\\n]+([a-zA-Z_][a-zA-Z0-9_$:]*[ \\t\\n]+)?(?:((?:un)?signed)[ \\t\\n]+)?(?:(\\[[a-zA-Z0-9_:$\\-\\+` \\t\\n\\[\\]]*\\])[ \\t\\n]*)?([a-zA-Z_][a-zA-Z0-9_$]*)(?:[ \\t\\n]*(\\[[a-zA-Z0-9_:$\\-\\+` \\t\\n\\[\\]]*\\]))?[ \\t\\n]*(?==)",
      "captures": {
        "1": {
          "name": "keyword.other.systemverilog"
        },
        "2": {
          "patterns": [
            {
              "include": "#storage-scope"
            }
          ],
          "name": "storage.type.built-in.systemverilog"
        },
        "3": {
          "name": "storage.modifier.systemverilog"
        },
        "4": {
          "patterns": [
            {
              "include": "#selects"
            }
          ]
        },
        "5": {
          "name": "constant.other.systemverilog"
        },
        "6": {
          "patterns": [
            {
              "include": "#selects"
            }
          ]
        }
      },
      "name": "meta.param.systemverilog"
    },
    "sv-option": {
      "match": "[ \\t\\n]*\\b(option)\\.",
      "captures": {
        "1": {
          "name": "keyword.cover.systemverilog"
        }
      }
    },
    "sv-local": {
      "match": "[ \\t\\n]*\\b(const|static|protected|virtual|localparam|parameter|local)\\b",
      "captures": {
        "1": {
          "name": "keyword.other.systemverilog"
        }
      }
    },
    "sv-rand": {
      "match": "[ \\t\\n]*\\b(?:rand|randc)\\b",
      "name": "storage.type.rand.systemverilog"
    },
    "module-parameters": {
      "begin": "[ \\t\\n]*\\b(?:(bind)[ \\t\\n]+([a-zA-Z_][a-zA-Z0-9_$\\.]*)[ \\t\\n]+)?([a-zA-Z_][a-zA-Z0-9_$]*)[ \\t\\n]+(?!intersect|and|or|throughout|within)(?=#[^#])",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.systemverilog"
        },
        "2": {
          "name": "entity.name.type.module.systemverilog"
        },
        "3": {
          "name": "entity.name.type.module.systemverilog"
        }
      },
      "end": ";",
      "endCaptures": {
        "0": {
          "name": "punctuation.module.instantiation.end.systemverilog"
        }
      },
      "patterns": [
        {
          "include": "#module-binding"
        },
        {
          "include": "#parameters"
        },
        {
          "include": "#comments"
        },
        {
          "include": "#operators"
        },
        {
          "include": "#constants"
        },
        {
          "include": "#strings"
        },
        {
          "include": "#port-declaration"
        },
        {
          "match": "\\b([a-zA-Z_][a-zA-Z0-9_$]*)\\b(?=[ \\t\\n]*(\\(|$))",
          "name": "variable.other.module.systemverilog"
        },
        {
          "include": "#identifiers"
        }
      ],
      "name": "meta.module.parameters.systemverilog"
    },
    "module-no-parameters": {
      "begin": "[ \\t\\n]*\\b(?:(bind)[ \\t\\n]+([a-zA-Z_][a-zA-Z0-9_$\\.]*)[ \\t\\n]+)?([a-zA-Z_][a-zA-Z0-9_$]*)[ \\t\\n]+(?!intersect|and|or|throughout|within)([a-zA-Z_][a-zA-Z0-9_$]*)(?:[ \\t\\n]*(\\[[a-zA-Z0-9_:$\\-\\+` \\t\\n\\[\\]]*\\])?)[ \\t\\n]*(?=\\(|;)",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.systemverilog"
        },
        "2": {
          "name": "entity.name.type.module.systemverilog"
        },
        "3": {
          "name": "entity.name.type.module.systemverilog"
        },
        "4": {
          "name": "variable.other.module.systemverilog"
        },
        "5": {
          "patterns": [
            {
              "include": "#selects"
            }
          ]
        }
      },
      "end": ";",
      "endCaptures": {
        "0": {
          "name": "punctuation.module.instantiation.end.systemverilog"
        }
      },
      "patterns": [
        {
          "include": "#module-binding"
        },
        {
          "include": "#comments"
        },
        {
          "include": "#operators"
        },
        {
          "include": "#constants"
        },
        {
          "include": "#strings"
        },
        {
          "include": "#port-declaration"
        },
        {
          "match": "\\b([a-zA-Z_][a-zA-Z0-9_$]*)\\b(?=[ \\t\\n]*(\\(|$))",
          "name": "variable.other.module.systemverilog"
        },
        {
          "include": "#identifiers"
        }
      ],
      "name": "meta.module.no_parameters.systemverilog"
    },
    "functions": {
      "match": "[ \\t\\n]*\\b([a-zA-Z_][a-zA-Z0-9_$]*)(?=[ \\t\\n]*\\()",
      "name": "entity.name.function.systemverilog"
    },
    "all-types": {
      "patterns": [
        {
          "include": "#built-ins"
        },
        {
          "include": "#modifiers"
        }
      ]
    },
    "constants": {
      "patterns": [
        {
          "match": "(\\b[1-9][0-9_]*)?'([sS]?[bB][ \\t\\n]*[0-1xXzZ?][0-1_xXzZ?]*|[sS]?[oO][ \\t\\n]*[0-7xXzZ?][0-7_xXzZ?]*|[sS]?[dD][ \\t\\n]*[0-9xXzZ?][0-9_xXzZ?]*|[sS]?[hH][ \\t\\n]*[0-9a-fA-FxXzZ?][0-9a-fA-F_xXzZ?]*)((e|E)(\\+|-)?[0-9]+)?(?!'|\\w)",
          "name": "constant.numeric.systemverilog"
        },
        {
          "match": "'[01xXzZ]",
          "name": "constant.numeric.bit.systemverilog"
        },
        {
          "match": "\\b(?:\\d[\\d_\\.]*(?<!\\.)(?:e|E)(?:\\+|-)?[0-9]+)\\b",
          "name": "constant.numeric.exp.systemverilog"
        },
        {
          "match": "\\b(?:\\d[\\d_\\.]*(?!(?:[\\d\\.]|[ \\t\\n]*(?:e|E|fs|ps|ns|us|ms|s))))\\b",
          "name": "constant.numeric.decimal.systemverilog"
        },
        {
          "match": "\\b(?:\\d[\\d\\.]*[ \\t\\n]*(?:fs|ps|ns|us|ms|s))\\b",
          "name": "constant.numeric.time.systemverilog"
        },
        {
          "include": "#compiler-directives"
        },
        {
          "match": "\\b(?:this|super|null)\\b",
          "name": "constant.language.systemverilog"
        },
        {
          "match": "\\b([A-Z][A-Z0-9_]*)\\b",
          "name": "constant.other.net.systemverilog"
        },
        {
          "match": "\\b(?<!\\.)([A-Z_0-9]+)(?!\\.)\\b",
          "name": "constant.numeric.parameter.uppercase.systemverilog"
        },
        {
          "match": "\\.\\*",
          "name": "keyword.operator.quantifier.regexp"
        }
      ]
    },
    "operators": {
      "patterns": [
        {
          "match": "\\+=|-=|/=|\\*=|%=|&=|\\|=|\\^=|>>>=|>>=|<<<=|<<=|<=|=",
          "name": "keyword.operator.assignment.systemverilog"
        },
        {
          "match": "\\+\\+",
          "name": "keyword.operator.increment.systemverilog"
        },
        {
          "match": "--",
          "name": "keyword.operator.decrement.systemverilog"
        },
        {
          "match": "\\+|-|\\*\\*|\\*|/|%",
          "name": "keyword.operator.arithmetic.systemverilog"
        },
        {
          "match": "!|&&|\\|\\|",
          "name": "keyword.operator.logical.systemverilog"
        },
        {
          "match": "<<<|<<|>>>|>>",
          "name": "keyword.operator.bitwise.shift.systemverilog"
        },
        {
          "match": "~&|~\\||~|\\^~|~\\^|&|\\||\\^|{|''{|}|:|\\?",
          "name": "keyword.operator.bitwise.systemverilog"
        },
        {
          "match": "<=|<|>=|>|==\\?|!=\\?|===|!==|==|!=",
          "name": "keyword.operator.comparison.systemverilog"
        },
        {
          "match": "@|#|->|<->",
          "name": "keyword.operator.channel.systemverilog"
        },
        {
          "match": "\\b(?:dist|inside|or|and)\\b|:=|:/|\\|->|\\|=>|#-#|#=#",
          "name": "keyword.operator.logical.systemverilog"
        }
      ]
    },
    "comments": {
      "patterns": [
        {
          "begin": "/\\*",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.comment.systemverilog"
            }
          },
          "end": "\\*/",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.comment.systemverilog"
            }
          },
          "patterns": [
            {
              "include": "#fixme-todo"
            }
          ],
          "name": "comment.block.systemverilog"
        },
        {
          "begin": "//",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.comment.systemverilog"
            }
          },
          "end": "$\\n?",
          "patterns": [
            {
              "include": "#fixme-todo"
            }
          ],
          "name": "comment.line.double-slash.systemverilog"
        }
      ]
    },
    "fixme-todo": {
      "patterns": [
        {
          "match": "(?i:fixme)",
          "name": "invalid.broken.fixme.systemverilog"
        },
        {
          "match": "(?i:todo)",
          "name": "invalid.unimplemented.todo.systemverilog"
        }
      ]
    },
    "port-declaration": {
      "patterns": [
        {
          "match": ",?[ \\t\\n]*\\b(output|input|inout|ref)\\b[ \\t\\n]+(?:\\b([a-zA-Z_][a-zA-Z0-9_$]*)(::))?([a-zA-Z_][a-zA-Z0-9_$]*\\b)?(?:[ \\t\\n]*(\\[[a-zA-Z0-9_:$\\-\\+` \\t\\n\\[\\]]*\\])?)(?:[ \\t\\n]*\\b([a-zA-Z_][a-zA-Z0-9_$]*)\\b)(?:[ \\t\\n]*(\\[[a-zA-Z0-9_:$\\-\\+` \\t\\n\\[\\]]*\\])?)(?:[ \\t\\n]*(,|;))?",
          "captures": {
            "1": {
              "name": "support.type.systemverilog"
            },
            "2": {
              "name": "support.type.scope.systemverilog"
            },
            "3": {
              "name": "keyword.operator.scope.systemverilog"
            },
            "4": {
              "patterns": [
                {
                  "include": "#built-ins"
                }
              ]
            },
            "5": {
              "patterns": [
                {
                  "include": "#selects"
                }
              ]
            },
            "6": {
              "patterns": [
                {
                  "include": "#identifiers"
                }
              ]
            },
            "7": {
              "patterns": [
                {
                  "include": "#selects"
                }
              ]
            },
            "8": {
              "name": "punctuation.terminator.port.systemverilog"
            }
          },
          "name": "meta.port.declaration.systemverilog"
        }
      ]
    },
    "base-grammar": {
      "patterns": [
        {
          "include": "#all-types"
        },
        {
          "include": "#comments"
        },
        {
          "include": "#operators"
        },
        {
          "include": "#constants"
        },
        {
          "include": "#strings"
        },
        {
          "match": "[ \\t\\n]*\\b([a-zA-Z_][a-zA-Z0-9_$]*)[ \\t\\n]+[a-zA-Z_][a-zA-Z0-9_,= \\t\\n]*",
          "captures": {
            "1": {
              "name": "storage.type.interface.systemverilog"
            }
          }
        },
        {
          "include": "#storage-scope"
        }
      ]
    },
    "built-ins": {
      "patterns": [
        {
          "match": "[ \\t\\n]*\\b(var|wire|tri|tri[01]|supply[01]|wand|triand|wor|trior|trireg|reg|integer|int|longint|shortint|logic|bit|byte|shortreal|string|time|realtime|real|process|void)\\b",
          "name": "storage.type.built-in.systemverilog"
        },
        {
          "match": "[ \\t\\n]*\\b(uvm_transaction|uvm_component|uvm_monitor|uvm_driver|uvm_test|uvm_env|uvm_object|uvm_agent|uvm_sequence_base|uvm_sequence|uvm_sequence_item|uvm_sequence_state|uvm_sequencer|uvm_sequencer_base|uvm_component_registry|uvm_analysis_imp|uvm_analysis_port|uvm_analysis_export|uvm_config_db|uvm_active_passive_enum|uvm_phase|uvm_verbosity|uvm_tlm_analysis_fifo|uvm_tlm_fifo|uvm_report_server|uvm_objection|uvm_recorder|uvm_domain|uvm_reg_field|uvm_reg|uvm_reg_block|uvm_bitstream_t|uvm_radix_enum|uvm_printer|uvm_packer|uvm_comparer|uvm_scope_stack)\\b",
          "name": "storage.type.uvm.systemverilog"
        }
      ]
    },
    "modifiers": {
      "match": "[ \\t\\n]*\\b(?:(?:un)?signed|small|medium|large|supply[01]|strong[01]|pull[01]|weak[01]|highz[01])\\b",
      "name": "storage.modifier.systemverilog"
    },
    "storage-scope": {
      "match": "\\b([a-zA-Z_][a-zA-Z0-9_$]*)(::)",
      "captures": {
        "1": {
          "name": "support.type.systemverilog"
        },
        "2": {
          "name": "keyword.operator.scope.systemverilog"
        }
      },
      "name": "meta.scope.systemverilog"
    },
    "interface-port": {
      "match": "[ \\t\\n]*\\b([a-zA-Z_][a-zA-Z0-9_$]*)(?:\\.([a-zA-Z_][a-zA-Z0-9_$]*))?[ \\t\\n]+([a-zA-Z_][a-zA-Z0-9_$]*)\\b",
      "captures": {
        "1": {
          "name": "storage.type.interface.systemverilog"
        },
        "2": {
          "name": "support.modport.systemverilog"
        },
        "3": {
          "patterns": [
            {
              "include": "#identifiers"
            }
          ]
        }
      },
      "name": "meta.interface-port.declaration.systemverilog"
    },
    "strings": {
      "patterns": [
        {
          "begin": "`?\"",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.systemverilog"
            }
          },
          "end": "\"`?",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.systemverilog"
            }
          },
          "name": "string.quoted.double.systemverilog",
          "patterns": [
            {
              "match": "\\\\(?:[nt\\\\\"vfa]|[0-7]{3}|x[0-9a-fA-F]{2})",
              "name": "constant.character.escape.systemverilog"
            },
            {
              "match": "(?x)%\n(\\d+\\$)?                              # field (argument #)\n['\\-+0 #]*                            # flags\n[,;:_]?                               # separator character\n((-?\\d+)|\\*(-?\\d+\\$)?)?               # minimum field width\n(\\.((-?\\d+)|\\*(-?\\d+\\$)?)?)?          # precision\n(hh|h|ll|l|j|z|t|L)?                  # length modifier\n[xXhHdDoObBcClLvVmMpPsStTuUzZeEfFgG%] # conversion type",
              "name": "constant.character.format.placeholder.systemverilog"
            },
            {
              "match": "%",
              "name": "invalid.illegal.placeholder.systemverilog"
            },
            {
              "include": "#fixme-todo"
            }
          ]
        },
        {
          "begin": "(?<=include)[ \\t\\n]*(<)",
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.string.begin.systemverilog"
            }
          },
          "end": ">",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.systemverilog"
            }
          },
          "name": "string.quoted.other.lt-gt.include.systemverilog"
        }
      ]
    },
    "module-binding": {
      "begin": "\\.([a-zA-Z_][a-zA-Z0-9_$]*)[ \\t\\n]*\\(",
      "beginCaptures": {
        "1": {
          "name": "support.function.port.systemverilog"
        }
      },
      "end": "\\),?",
      "patterns": [
        {
          "include": "#constants"
        },
        {
          "include": "#comments"
        },
        {
          "include": "#operators"
        },
        {
          "include": "#strings"
        },
        {
          "include": "#constants"
        },
        {
          "include": "#storage-scope"
        },
        {
          "include": "#cast-operator"
        },
        {
          "include": "#system-tf"
        },
        {
          "match": "\\bvirtual\\b",
          "name": "keyword.control.systemverilog"
        },
        {
          "include": "#identifiers"
        }
      ],
      "name": "meta.port.binding.systemverilog"
    },
    "parameters": {
      "begin": "(#)[ \\t\\n]*(\\()",
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.channel.systemverilog"
        },
        "2": {
          "name": "punctuation.section.parameters.begin"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.section.parameters.end"
        }
      },
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "include": "#constants"
        },
        {
          "include": "#operators"
        },
        {
          "include": "#strings"
        },
        {
          "include": "#module-binding"
        },
        {
          "match": "\\bvirtual\\b",
          "name": "keyword.control.systemverilog"
        }
      ],
      "name": "meta.parameters.systemverilog"
    },
    "identifiers": {
      "patterns": [
        {
          "match": "\\b[a-zA-Z_][a-zA-Z0-9_$]*\\b",
          "name": "variable.other.identifier.systemverilog"
        },
        {
          "match": "(?<=^|[ \\t\\n])\\\\[!-~]+",
          "name": "variable.other.identifier.systemverilog"
        }
      ]
    },
    "selects": {
      "begin": "\\[",
      "beginCaptures": {
        "0": {
          "name": "punctuation.slice.brackets.begin"
        }
      },
      "end": "\\]",
      "endCaptures": {
        "0": {
          "name": "punctuation.slice.brackets.end"
        }
      },
      "patterns": [
        {
          "match": "\\$",
          "name": "constant.language.systemverilog"
        },
        {
          "include": "#constants"
        },
        {
          "include": "#operators"
        },
        {
          "match": "[a-zA-Z0-9_$]+",
          "name": "meta.index.systemverilog"
        }
      ],
      "name": "meta.brackets.select.systemverilog"
    },
    "attributes": {
      "begin": "(?<!@[ \\t\\n]?)\\(\\*",
      "beginCaptures": {
        "0": {
          "name": "punctuation.attribute.rounds.begin"
        }
      },
      "end": "\\*\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.attribute.rounds.end"
        }
      },
      "patterns": [
        {
          "match": "([a-zA-Z_][a-zA-Z0-9_$]*)(?:[ \\t\\n]*(=)[ \\t\\n]*)?",
          "captures": {
            "1": {
              "name": "keyword.control.systemverilog"
            },
            "2": {
              "name": "keyword.operator.assignment.systemverilog"
            }
          }
        },
        {
          "include": "#constants"
        },
        {
          "include": "#strings"
        }
      ],
      "name": "meta.attribute.systemverilog"
    },
    "imports": {
      "match": "[ \\t\\n]*\\b(import|export)[ \\t\\n]+([a-zA-Z_][a-zA-Z0-9_$]*|\\*)[ \\t\\n]*(::)[ \\t\\n]*([a-zA-Z_][a-zA-Z0-9_$]*|\\*)[ \\t\\n]*(,|;)",
      "captures": {
        "1": {
          "name": "keyword.control.systemverilog"
        },
        "2": {
          "name": "support.type.systemverilog"
        },
        "3": {
          "name": "keyword.operator.scope.systemverilog"
        },
        "4": {
          "patterns": [
            {
              "include": "#operators"
            },
            {
              "include": "#identifiers"
            }
          ]
        }
      },
      "name": "meta.import.systemverilog"
    }
  }
}
