diff --git a/.gitmodules b/.gitmodules index 3dcbc519..09231226 100644 --- a/.gitmodules +++ b/.gitmodules @@ -216,3 +216,6 @@ [submodule "assets/syntaxes/02_Extra/gnuplot"] path = assets/syntaxes/02_Extra/gnuplot url = https://github.com/hesstobi/sublime_gnuplot +[submodule "assets/syntaxes/02_Extra/SystemVerilog"] + path = assets/syntaxes/02_Extra/SystemVerilog + url = git@github.com:TheClams/SystemVerilog.git diff --git a/CHANGELOG.md b/CHANGELOG.md index a709eacf..2b02eb41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # unreleased ## Features +- Add SystemVerilog file syntax, see #1580 (@SeanMcLoughlin) ## Bugfixes diff --git a/assets/syntaxes.bin b/assets/syntaxes.bin index f4266b48..36ab4385 100644 Binary files a/assets/syntaxes.bin and b/assets/syntaxes.bin differ diff --git a/assets/syntaxes/02_Extra/SystemVerilog b/assets/syntaxes/02_Extra/SystemVerilog new file mode 160000 index 00000000..7eca705e --- /dev/null +++ b/assets/syntaxes/02_Extra/SystemVerilog @@ -0,0 +1 @@ +Subproject commit 7eca705e87f87b94478fe222fc91d54d488cc8e3 diff --git a/src/assets.rs b/src/assets.rs index 19650a27..bac0c430 100644 --- a/src/assets.rs +++ b/src/assets.rs @@ -450,6 +450,7 @@ mod tests { assert_eq!(test.syntax_for_file("test.sass"), "Sass"); assert_eq!(test.syntax_for_file("test.js"), "JavaScript (Babel)"); assert_eq!(test.syntax_for_file("test.fs"), "F#"); + assert_eq!(test.syntax_for_file("test.v"), "Verilog"); } #[test] diff --git a/tests/no_duplicate_extensions.rs b/tests/no_duplicate_extensions.rs index 7bfe431a..b2be5e4e 100644 --- a/tests/no_duplicate_extensions.rs +++ b/tests/no_duplicate_extensions.rs @@ -17,6 +17,9 @@ fn no_duplicate_extensions() { // The '.fs' extension appears in F# and GLSL. // We default to F#. "fs", + // SystemVerilog and Verilog both use .v files. + // We default to Verilog. + "v", ]; let assets = HighlightingAssets::from_binary(); diff --git a/tests/syntax-tests/highlighted/SystemVerilog/output.sv b/tests/syntax-tests/highlighted/SystemVerilog/output.sv new file mode 100644 index 00000000..67d05516 --- /dev/null +++ b/tests/syntax-tests/highlighted/SystemVerilog/output.sv @@ -0,0 +1,103 @@ +`timescale 1ns/1ps + +// Design Code +module ADDER( + input clk, + input [7:0] a, + input [7:0] b, + input bIsPos, + output reg [8:0] result +); + + always @ (posedge clk) begin + if (bIsPos) begin  + result <= a + b; + end else begin + result <= a - b; + end + end + +endmodule: ADDER + +interface adder_if( + input bit clk, + input [7:0] a, + input [7:0] b, + input bIsPos, + input [8:0] result +); + + clocking cb @(posedge clk); + output a; + output b; + output bIsPos; + input result; + endclocking : cb + +endinterface: adder_if + + +bind ADDER adder_if my_adder_if( + .clk(clk), + .a(a), + .b(b), + .bIsPos(bIsPos), + .result(result) +); + + +// Testbench Code +import uvm_pkg::*; +`include "uvm_macros.svh" + +class testbench_env extends uvm_env; + + virtual adder_if m_if; + + function new(string name, uvm_component parent = null); + super.new(name, parent); + endfunction +  + function void connect_phase(uvm_phase phase); + assert(uvm_resource_db#(virtual adder_if)::read_by_name(get_full_name(), "adder_if", m_if)); + endfunction: connect_phase + + task run_phase(uvm_phase phase); + phase.raise_objection(this); + `uvm_info(get_name(), "Starting test!", UVM_HIGH); + begin + int a = 8'h4, b = 8'h5; + @(m_if.cb); + m_if.cb.a <= a; + m_if.cb.b <= b; + m_if.cb.bIsPos <= 1'b1; + repeat(2) @(m_if.cb); + `uvm_info(get_name(), $sformatf("%0d + %0d = %0d", a, b, m_if.cb.result), UVM_LOW); + end + `uvm_info(get_name(), "Ending test!", UVM_HIGH); + phase.drop_objection(this); + endtask: run_phase +endclass + + +module top; + + bit clk; + env environment; + ADDER dut(.clk (clk)); + + initial begin + environment = new("testbench_env"); + uvm_resource_db#(virtual adder_if)::set("env", "adder_if", dut.my_adder_if); + clk = 0; + run_test(); + end + + // Clock generation  + initial begin + forever begin + #(1) clk = ~clk; + end + end +  +endmodule diff --git a/tests/syntax-tests/source/SystemVerilog/output.sv b/tests/syntax-tests/source/SystemVerilog/output.sv new file mode 100644 index 00000000..699cf04e --- /dev/null +++ b/tests/syntax-tests/source/SystemVerilog/output.sv @@ -0,0 +1,103 @@ +`timescale 1ns/1ps + +// Design Code +module ADDER( + input clk, + input [7:0] a, + input [7:0] b, + input bIsPos, + output reg [8:0] result +); + + always @ (posedge clk) begin + if (bIsPos) begin + result <= a + b; + end else begin + result <= a - b; + end + end + +endmodule: ADDER + +interface adder_if( + input bit clk, + input [7:0] a, + input [7:0] b, + input bIsPos, + input [8:0] result +); + + clocking cb @(posedge clk); + output a; + output b; + output bIsPos; + input result; + endclocking : cb + +endinterface: adder_if + + +bind ADDER adder_if my_adder_if( + .clk(clk), + .a(a), + .b(b), + .bIsPos(bIsPos), + .result(result) +); + + +// Testbench Code +import uvm_pkg::*; +`include "uvm_macros.svh" + +class testbench_env extends uvm_env; + + virtual adder_if m_if; + + function new(string name, uvm_component parent = null); + super.new(name, parent); + endfunction + + function void connect_phase(uvm_phase phase); + assert(uvm_resource_db#(virtual adder_if)::read_by_name(get_full_name(), "adder_if", m_if)); + endfunction: connect_phase + + task run_phase(uvm_phase phase); + phase.raise_objection(this); + `uvm_info(get_name(), "Starting test!", UVM_HIGH); + begin + int a = 8'h4, b = 8'h5; + @(m_if.cb); + m_if.cb.a <= a; + m_if.cb.b <= b; + m_if.cb.bIsPos <= 1'b1; + repeat(2) @(m_if.cb); + `uvm_info(get_name(), $sformatf("%0d + %0d = %0d", a, b, m_if.cb.result), UVM_LOW); + end + `uvm_info(get_name(), "Ending test!", UVM_HIGH); + phase.drop_objection(this); + endtask: run_phase +endclass + + +module top; + + bit clk; + env environment; + ADDER dut(.clk (clk)); + + initial begin + environment = new("testbench_env"); + uvm_resource_db#(virtual adder_if)::set("env", "adder_if", dut.my_adder_if); + clk = 0; + run_test(); + end + + // Clock generation + initial begin + forever begin + #(1) clk = ~clk; + end + end + +endmodule