rvvm 0.9.2 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +35 -5
- data/bin/sandbox +4 -0
- data/lib/rvvm/templates.rb +7 -1
- data/lib/rvvm/utils.rb +60 -3
- data/lib/rvvm/version.rb +3 -1
- data/lib/rvvm.rb +149 -28
- metadata +2 -1
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 01a0976fb744924367077dfda5f613dbf6912032fbc61896c41aa647f606863e
         | 
| 4 | 
            +
              data.tar.gz: 188c360b6cf73c1c4478c1cbb8d1f665daf6523a97b5c286a63ea0b3ab056fc2
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: ea4aaab4ac74410dcded24b69db2953ee51e2811539fec0e08891097231f4551ace3cb25fd7a68fe6a8afceeeddce9bed4ba277edddf453036d88ddea2e986ee
         | 
| 7 | 
            +
              data.tar.gz: 67315687f47c4648af7db0b66530bfb3dae52affd5ee1ea97b7d1b16099ba1409e1fc4df805b4639dedebffd7afe43fdec91166c33f23c778928ca8585e49400
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -47,16 +47,46 @@ | |
| 47 47 |  | 
| 48 48 | 
             
            1. Test list parsing and batch simulation
         | 
| 49 49 | 
             
            2. Unit tests
         | 
| 50 | 
            -
            3. CLI log  | 
| 50 | 
            +
            3. CLI log graphic
         | 
| 51 51 |  | 
| 52 52 | 
             
            ## [0.9.1] - 2024-09-16
         | 
| 53 53 |  | 
| 54 | 
            -
            ### Fixes
         | 
| 54 | 
            +
            ### Fixes:
         | 
| 55 55 |  | 
| 56 | 
            -
            1. Fixed rvvm exacutable being excluded by gemspec
         | 
| 56 | 
            +
            1. Fixed `rvvm` exacutable being excluded by gemspec
         | 
| 57 57 |  | 
| 58 58 | 
             
            ## [0.9.2] - 2024-09-16
         | 
| 59 59 |  | 
| 60 | 
            -
            ### Fixes
         | 
| 60 | 
            +
            ### Fixes:
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            1. `rvvm` executable still missing after 0.9.1 update
         | 
| 63 | 
            +
             | 
| 64 | 
            +
            ### TBI:
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            1. Test list parsing and batch simulation
         | 
| 67 | 
            +
            2. Tests
         | 
| 68 | 
            +
            3. CLI log graphic
         | 
| 69 | 
            +
            4. Project config load failure handling/error message when parsing invalid json
         | 
| 70 | 
            +
            5. Template file generation in pwd
         | 
| 71 | 
            +
            6. Elaboration and simulation custom waveform trace dump file
         | 
| 72 | 
            +
             | 
| 73 | 
            +
            ## [0.9.3] - 2024-09-16
         | 
| 74 | 
            +
             | 
| 75 | 
            +
            ### Added:
         | 
| 76 | 
            +
             | 
| 77 | 
            +
            1. Test list parsing and batch simulation
         | 
| 78 | 
            +
            2. Tests
         | 
| 79 | 
            +
            3. Updated gitlab pipeline
         | 
| 80 | 
            +
            4. `sandbox` script to play with during development
         | 
| 81 | 
            +
            5. Code documentation
         | 
| 82 | 
            +
             | 
| 83 | 
            +
            ### Fixed:
         | 
| 84 | 
            +
             | 
| 85 | 
            +
            1. Hash key conversion to symbols when parsing config json
         | 
| 86 | 
            +
             | 
| 87 | 
            +
            ### TBI:
         | 
| 61 88 |  | 
| 62 | 
            -
            1.  | 
| 89 | 
            +
            1. CLI log graphic
         | 
| 90 | 
            +
            2. Project config load failure handling/error message when parsing invalid json
         | 
| 91 | 
            +
            3. Template file generation in pwd
         | 
| 92 | 
            +
            4. Elaboration and simulation custom waveform trace dump file
         | 
    
        data/bin/sandbox
    ADDED
    
    
    
        data/lib/rvvm/templates.rb
    CHANGED
    
    | @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            +
            # Module containing template hashes for rvvm.
         | 
| 3 4 | 
             
            module Templates
         | 
| 4 5 | 
             
              @templates = {}
         | 
| 5 6 |  | 
| @@ -49,7 +50,7 @@ module Templates | |
| 49 50 | 
             
                "verbosity": "LOW",
         | 
| 50 51 | 
             
                "defTest": " ",
         | 
| 51 52 | 
             
                "batch": 0,
         | 
| 52 | 
            -
                " | 
| 53 | 
            +
                "testlist": [" "],
         | 
| 53 54 | 
             
                "args": " "
         | 
| 54 55 | 
             
              }
         | 
| 55 56 | 
             
            })
         | 
| @@ -245,6 +246,11 @@ endpackage | |
| 245 246 | 
             
            )
         | 
| 246 247 | 
             
              }
         | 
| 247 248 |  | 
| 249 | 
            +
              # Loads template hashes.
         | 
| 250 | 
            +
              #
         | 
| 251 | 
            +
              # @return [Hash] template hashes
         | 
| 252 | 
            +
              #
         | 
| 253 | 
            +
              # @since 0.8.0
         | 
| 248 254 | 
             
              def self.load
         | 
| 249 255 | 
             
                @templates
         | 
| 250 256 | 
             
              end
         | 
    
        data/lib/rvvm/utils.rb
    CHANGED
    
    | @@ -1,12 +1,35 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            +
            # Utils module providing utilities and helper methods to rvvm.
         | 
| 4 | 
            +
            #
         | 
| 5 | 
            +
            # Mainly used to generate files and templates.
         | 
| 6 | 
            +
            #
         | 
| 7 | 
            +
            # @since 0.1.0
         | 
| 3 8 | 
             
            module Utils
         | 
| 4 | 
            -
               | 
| 9 | 
            +
              # Interpolates string.
         | 
| 10 | 
            +
              #
         | 
| 11 | 
            +
              # Replaces named keys `${example_key}` with provided values based on a hash.
         | 
| 12 | 
            +
              #
         | 
| 13 | 
            +
              # @param string [String] string to be interpolated
         | 
| 14 | 
            +
              # @param hash [Hash] Hash to provide values to replace instead of the named keys
         | 
| 15 | 
            +
              #
         | 
| 16 | 
            +
              # @return [string] interpolated string
         | 
| 17 | 
            +
              #
         | 
| 18 | 
            +
              # @since 0.1.0
         | 
| 19 | 
            +
              def self.interpolate(string, hash)
         | 
| 5 20 | 
             
                string.gsub(/\$\{([^}]+)\}/) do |match|
         | 
| 6 21 | 
             
                  hash[Regexp.last_match(1).to_sym] || match
         | 
| 7 22 | 
             
                end
         | 
| 8 23 | 
             
              end
         | 
| 9 24 |  | 
| 25 | 
            +
              # Generates a file with a provided content.
         | 
| 26 | 
            +
              #
         | 
| 27 | 
            +
              # @param path [String] path of the file to be generated
         | 
| 28 | 
            +
              # @param content [String] content of the file to be generated
         | 
| 29 | 
            +
              #
         | 
| 30 | 
            +
              # @return [void]
         | 
| 31 | 
            +
              #
         | 
| 32 | 
            +
              # @since 0.8.0
         | 
| 10 33 | 
             
              def self.gen_file(path, content)
         | 
| 11 34 | 
             
                File.open(path, "w") do |file|
         | 
| 12 35 | 
             
                  file.write(content)
         | 
| @@ -15,16 +38,36 @@ module Utils | |
| 15 38 | 
             
                puts "\nFailed to create a file!\nError #{e.message}"
         | 
| 16 39 | 
             
              end
         | 
| 17 40 |  | 
| 41 | 
            +
              # Generates a file based on a template.
         | 
| 42 | 
            +
              #
         | 
| 43 | 
            +
              # @param template [Hash] hash with the template content
         | 
| 44 | 
            +
              # @param name [String] name of the file to be generated
         | 
| 45 | 
            +
              # @param config [Hash] template config hash for content interpolation
         | 
| 46 | 
            +
              # @param path [String] path of the template file to be generated (excluding file name)
         | 
| 47 | 
            +
              #
         | 
| 48 | 
            +
              # @return [void]
         | 
| 49 | 
            +
              #
         | 
| 50 | 
            +
              # @since 0.8.0
         | 
| 18 51 | 
             
              def self.gen_template(template, name = nil, config = nil, path = nil)
         | 
| 19 52 | 
             
                temp_config = config || template[:config]
         | 
| 20 | 
            -
                content =  | 
| 53 | 
            +
                content = interpolate(template[:content], temp_config)
         | 
| 21 54 | 
             
                filename = name || template[:file][:name]
         | 
| 22 55 | 
             
                filepath = path || template[:file][:path]
         | 
| 23 56 |  | 
| 24 | 
            -
                puts "Generating: #{filepath}/#{filename}"
         | 
| 57 | 
            +
                puts "      Generating: #{filepath}/#{filename}"
         | 
| 25 58 | 
             
                gen_file("#{filepath}/#{filename}", content)
         | 
| 26 59 | 
             
              end
         | 
| 27 60 |  | 
| 61 | 
            +
              # Recursively searches provided directory for a file.
         | 
| 62 | 
            +
              #
         | 
| 63 | 
            +
              # @param filename [String] name of the file to look for
         | 
| 64 | 
            +
              # @param path [String] path to start search on
         | 
| 65 | 
            +
              #
         | 
| 66 | 
            +
              # @return [String] path of the first occurence of the file
         | 
| 67 | 
            +
              # or
         | 
| 68 | 
            +
              # @return [nil] if file not found
         | 
| 69 | 
            +
              #
         | 
| 70 | 
            +
              # @since 0.8.0
         | 
| 28 71 | 
             
              def self.find_file_dir(filename, path)
         | 
| 29 72 | 
             
                Dir.foreach(path) do |file|
         | 
| 30 73 | 
             
                  next if file == "."
         | 
| @@ -42,6 +85,11 @@ module Utils | |
| 42 85 | 
             
                nil
         | 
| 43 86 | 
             
              end
         | 
| 44 87 |  | 
| 88 | 
            +
              # Extracts git username using git config system call.
         | 
| 89 | 
            +
              #
         | 
| 90 | 
            +
              # @return [String] git username
         | 
| 91 | 
            +
              #
         | 
| 92 | 
            +
              # @since 0.9.0
         | 
| 45 93 | 
             
              def self.git_userame
         | 
| 46 94 | 
             
                username = nil
         | 
| 47 95 | 
             
                IO.popen("git config --get user.name") do |handle|
         | 
| @@ -52,6 +100,15 @@ module Utils | |
| 52 100 | 
             
                username
         | 
| 53 101 | 
             
              end
         | 
| 54 102 |  | 
| 103 | 
            +
              # Checks if hash contains keys provided from an array.
         | 
| 104 | 
            +
              #
         | 
| 105 | 
            +
              # @param hash [Hash] hash to analyze
         | 
| 106 | 
            +
              # @param arra [Array] array of keys to look for in the hash
         | 
| 107 | 
            +
              #
         | 
| 108 | 
            +
              # @return [Bolean] true if all provided keys from a hash return nil
         | 
| 109 | 
            +
              # @return [Boolean] false if a provided key is found in the hash
         | 
| 110 | 
            +
              #
         | 
| 111 | 
            +
              # @since 0.9.0
         | 
| 55 112 | 
             
              def self.all_nil?(hash, array)
         | 
| 56 113 | 
             
                array.each do |key|
         | 
| 57 114 | 
             
                  return false if hash[key]
         | 
    
        data/lib/rvvm/version.rb
    CHANGED
    
    
    
        data/lib/rvvm.rb
    CHANGED
    
    | @@ -8,13 +8,28 @@ require "optparse" | |
| 8 8 | 
             
            require "fileutils"
         | 
| 9 9 | 
             
            require "json"
         | 
| 10 10 |  | 
| 11 | 
            +
            # Top level module of the rvvm cli meta tool.
         | 
| 12 | 
            +
            #
         | 
| 13 | 
            +
            # Handles argument parsing, project creation, template file
         | 
| 14 | 
            +
            # generation and all interaction with Xilinx Vivado tools.
         | 
| 15 | 
            +
            #
         | 
| 16 | 
            +
            # Argument parsing runs on `require`, rest is run using run
         | 
| 17 | 
            +
            #
         | 
| 18 | 
            +
            # @example
         | 
| 19 | 
            +
            #   require "rvvm"
         | 
| 20 | 
            +
            #
         | 
| 21 | 
            +
            #   Rvvm.run
         | 
| 22 | 
            +
            #
         | 
| 23 | 
            +
            # @since 0.1.0
         | 
| 11 24 | 
             
            module Rvvm
         | 
| 12 25 | 
             
              class Error < StandardError; end
         | 
| 13 26 |  | 
| 27 | 
            +
              # Module instance variables to hold tempaltes and project config
         | 
| 14 28 | 
             
              @templates = Templates.load
         | 
| 15 29 | 
             
              @config_path = nil
         | 
| 16 30 | 
             
              @config = nil
         | 
| 17 31 |  | 
| 32 | 
            +
              # Instance variables to hold parsed args and required arg symbol list
         | 
| 18 33 | 
             
              @args = {}
         | 
| 19 34 | 
             
              @required_args = %i[
         | 
| 20 35 | 
             
                version
         | 
| @@ -34,6 +49,8 @@ module Rvvm | |
| 34 49 | 
             
                covreport
         | 
| 35 50 | 
             
              ]
         | 
| 36 51 |  | 
| 52 | 
            +
              # Script argument parsing block.
         | 
| 53 | 
            +
              # Runs on loading the module using require.
         | 
| 37 54 | 
             
              OptionParser.new do |args|
         | 
| 38 55 | 
             
                args.on("-h", "--help", "Shows this help") do
         | 
| 39 56 | 
             
                  puts "\nRVvM - Ruby Vivado Manager\n\n"
         | 
| @@ -44,16 +61,11 @@ module Rvvm | |
| 44 61 | 
             
                  @current_time = Time.now
         | 
| 45 62 | 
             
                  @formatted_time = @current_time.strftime("%Y-%m-%d %H:%M:%S")
         | 
| 46 63 |  | 
| 47 | 
            -
             | 
| 48 64 | 
             
                  req_args = String.new
         | 
| 49 65 | 
             
                  @required_args.each do |arg|
         | 
| 50 66 | 
             
                    req_args << "--#{arg} "
         | 
| 51 67 | 
             
                  end
         | 
| 52 68 | 
             
                  puts "\nRequired args (at least one): #{req_args}\n\n"
         | 
| 53 | 
            -
                  # puts "\nRequired args (at least one):"
         | 
| 54 | 
            -
                  # @required_args.each do |arg|
         | 
| 55 | 
            -
                  #   puts "\t--#{arg}"
         | 
| 56 | 
            -
                  # end
         | 
| 57 69 | 
             
                  exit(0)
         | 
| 58 70 | 
             
                end
         | 
| 59 71 | 
             
                args.on("-v", "--version", "Displays RVvM gem version") do
         | 
| @@ -66,7 +78,6 @@ module Rvvm | |
| 66 78 | 
             
                args.on("--pkg NAME", "Creates a SystemVerilog package template (default path: <prj dir>/design/pkg)")
         | 
| 67 79 | 
             
                args.on("--itf NAME", "Creates a SystemVerilog interface template (default path: <prj dir>/design/itf)")
         | 
| 68 80 | 
             
                args.on("--svfile NAME", "Creates a generic SystemVerilog file template (default path: <prj dir>/design/src)")
         | 
| 69 | 
            -
                # args.on("--here", "Speciies pwd as a path when creating a file template")
         | 
| 70 81 | 
             
                args.on("--path PATH", "Specifies a path relative to <prj dir> when creating a file template")
         | 
| 71 82 | 
             
                args.on("-c", "--comp", "Compile SystemVerilog sources")
         | 
| 72 83 | 
             
                args.on("-e", "--elab", "Elaborates project")
         | 
| @@ -97,22 +108,31 @@ module Rvvm | |
| 97 108 | 
             
                args.on("--debug", "Script debug")
         | 
| 98 109 | 
             
              end.parse!(into: @args)
         | 
| 99 110 |  | 
| 100 | 
            -
               | 
| 101 | 
            -
             | 
| 102 | 
            -
               | 
| 103 | 
            -
             | 
| 111 | 
            +
              # Simple argument check.
         | 
| 112 | 
            +
              #
         | 
| 113 | 
            +
              # @return [void]
         | 
| 114 | 
            +
              #
         | 
| 115 | 
            +
              # @since 0.8.0
         | 
| 104 116 | 
             
              def self.check_args
         | 
| 105 117 | 
             
                if @args[:all]
         | 
| 106 118 | 
             
                  @args[:comp] = 1
         | 
| 107 119 | 
             
                  @args[:elab] = 1
         | 
| 108 120 | 
             
                  @args[:run] = 1
         | 
| 109 121 | 
             
                end
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                # Check if a required arg is provided
         | 
| 110 124 | 
             
                if Utils.all_nil?(@args, @required_args)
         | 
| 111 125 | 
             
                  puts "\nNo required options provided!\nFor more info use -h or --help\n"
         | 
| 112 | 
            -
                  exit
         | 
| 126 | 
            +
                  exit(1)
         | 
| 113 127 | 
             
                end
         | 
| 114 128 | 
             
              end
         | 
| 115 129 |  | 
| 130 | 
            +
              # Argument collision handling and additional settings for
         | 
| 131 | 
            +
              # batch simulation and dpi compilation.
         | 
| 132 | 
            +
              #
         | 
| 133 | 
            +
              # @return [void]
         | 
| 134 | 
            +
              #
         | 
| 135 | 
            +
              # @since 0.8.0
         | 
| 116 136 | 
             
              def self.handle_args
         | 
| 117 137 | 
             
                @args[:dpi] = 1 if @args[:all] && @config[:dpi][:dpilib] == 1
         | 
| 118 138 |  | 
| @@ -127,6 +147,16 @@ module Rvvm | |
| 127 147 | 
             
                end
         | 
| 128 148 | 
             
              end
         | 
| 129 149 |  | 
| 150 | 
            +
              # Shell command with debug printout.
         | 
| 151 | 
            +
              #
         | 
| 152 | 
            +
              # If --debug arg provided instead of calling `system` 
         | 
| 153 | 
            +
              # prints the input command.
         | 
| 154 | 
            +
              #
         | 
| 155 | 
            +
              # @param command [String] command to be called/printed
         | 
| 156 | 
            +
              #
         | 
| 157 | 
            +
              # @return [void]
         | 
| 158 | 
            +
              #
         | 
| 159 | 
            +
              # @since 0.8.0
         | 
| 130 160 | 
             
              def self.execute(command)
         | 
| 131 161 | 
             
                if @args[:debug]
         | 
| 132 162 | 
             
                  puts command
         | 
| @@ -135,6 +165,13 @@ module Rvvm | |
| 135 165 | 
             
                end
         | 
| 136 166 | 
             
              end
         | 
| 137 167 |  | 
| 168 | 
            +
              # Creates a new RVvM project template in pwd with a given name.
         | 
| 169 | 
            +
              #
         | 
| 170 | 
            +
              # @param name [String] project name
         | 
| 171 | 
            +
              #
         | 
| 172 | 
            +
              # @return [void]
         | 
| 173 | 
            +
              #
         | 
| 174 | 
            +
              # @since 0.8.0
         | 
| 138 175 | 
             
              def self.create_new_project(name)
         | 
| 139 176 | 
             
                puts "\nRVvM: Generating new project: #{name} ...\n"
         | 
| 140 177 |  | 
| @@ -187,15 +224,22 @@ module Rvvm | |
| 187 224 | 
             
                temp_conf[:PRJNAME] = name.upcase
         | 
| 188 225 | 
             
                Utils.gen_template(@templates[:tbtop], "#{name}_tb_top.sv", temp_conf)
         | 
| 189 226 |  | 
| 227 | 
            +
                puts " "
         | 
| 190 228 | 
             
                system("git init")
         | 
| 191 229 | 
             
                system("git add .")
         | 
| 192 230 | 
             
                system('git commit -am "Initial commit"')
         | 
| 193 231 |  | 
| 194 | 
            -
                puts "\nRVvM: New project generated.  | 
| 232 | 
            +
                puts "\nRVvM: New project generated. ^^\n\n"
         | 
| 195 233 |  | 
| 196 234 | 
             
                exit(0)
         | 
| 197 235 | 
             
              end
         | 
| 198 236 |  | 
| 237 | 
            +
              # Loads and parses rvvmconf.json config file from
         | 
| 238 | 
            +
              # an RVvM project rvvm directory.
         | 
| 239 | 
            +
              #
         | 
| 240 | 
            +
              # @return [void]
         | 
| 241 | 
            +
              #
         | 
| 242 | 
            +
              # @since 0.8.0
         | 
| 199 243 | 
             
              def self.load_config
         | 
| 200 244 | 
             
                puts "\nRVvM: Loading RVvM project config..."
         | 
| 201 245 |  | 
| @@ -210,14 +254,26 @@ module Rvvm | |
| 210 254 |  | 
| 211 255 | 
             
                @config = JSON.parse(json_file) if json_file
         | 
| 212 256 | 
             
                @config = @config.transform_values do |v|
         | 
| 213 | 
            -
                  v.transform_keys(&:to_sym)
         | 
| 257 | 
            +
                  v.is_a?(Hash) ? v.transform_keys(&:to_sym) : v
         | 
| 214 258 | 
             
                end.transform_keys(&:to_sym)
         | 
| 215 | 
            -
              end
         | 
| 216 259 |  | 
| 260 | 
            +
                puts @config[:simulation][:testlist]
         | 
| 261 | 
            +
              end
         | 
| 262 | 
            +
              
         | 
| 263 | 
            +
              # Navigates to project top (rvvm directory of the RVvM project).
         | 
| 264 | 
            +
              #
         | 
| 265 | 
            +
              # @return [void]
         | 
| 266 | 
            +
              #
         | 
| 267 | 
            +
              # @since 0.8.0
         | 
| 217 268 | 
             
              def self.prj_top
         | 
| 218 269 | 
             
                Dir.chdir(@config_path)
         | 
| 219 270 | 
             
              end
         | 
| 220 | 
            -
             | 
| 271 | 
            +
              
         | 
| 272 | 
            +
              # Compiles project SystemVerilog sources using xvlog.
         | 
| 273 | 
            +
              #
         | 
| 274 | 
            +
              # @return [void]
         | 
| 275 | 
            +
              #
         | 
| 276 | 
            +
              # @since 0.8.0
         | 
| 221 277 | 
             
              def self.compile
         | 
| 222 278 | 
             
                cmd_args = @config[:compilation][:args]
         | 
| 223 279 | 
             
                logname = @args[:complog] || File.join([@config[:project][:logDir], @config[:compilation][:logDir], @config[:compilation][:log]])
         | 
| @@ -228,7 +284,13 @@ module Rvvm | |
| 228 284 | 
             
                cmd = "xvlog -sv -f #{complist} -log #{logname} #{cmd_args}"
         | 
| 229 285 | 
             
                execute(cmd)
         | 
| 230 286 | 
             
              end
         | 
| 231 | 
            -
             | 
| 287 | 
            +
              
         | 
| 288 | 
            +
              # Compiles C/C++ sources into a shared library to use during
         | 
| 289 | 
            +
              # elaboration and simulation using DPI-C.
         | 
| 290 | 
            +
              #
         | 
| 291 | 
            +
              # @return [void]
         | 
| 292 | 
            +
              #
         | 
| 293 | 
            +
              # @Since 0.9.0
         | 
| 232 294 | 
             
              def self.dpi_c
         | 
| 233 295 | 
             
                cmd_args = @config[:dpi][:args]
         | 
| 234 296 | 
             
                dpilist = @args[:dpilist] || @config[:dpi][:list]
         | 
| @@ -238,7 +300,12 @@ module Rvvm | |
| 238 300 | 
             
                cmd = "sxc -f #{dpilist} #{cmd_args}"
         | 
| 239 301 | 
             
                execute(cmd)
         | 
| 240 302 | 
             
              end
         | 
| 241 | 
            -
             | 
| 303 | 
            +
              
         | 
| 304 | 
            +
              # Elaborates project into a testbench snapshot using xelab.
         | 
| 305 | 
            +
              #
         | 
| 306 | 
            +
              # @return [void]
         | 
| 307 | 
            +
              #
         | 
| 308 | 
            +
              # @since 0.8.0
         | 
| 242 309 | 
             
              def self.elaborate
         | 
| 243 310 | 
             
                cmd_args = @config[:elaboration][:args]
         | 
| 244 311 | 
             
                cmd_args << " -sv_lib dpi" if @args[:dpi] || @args[:dpilib] || @config[:dpi][:dpilib] == 1
         | 
| @@ -255,7 +322,12 @@ module Rvvm | |
| 255 322 | 
             
                cmd = "xelab #{tb_top} -relax -s #{tb} -timescale #{timescale} -log #{logname} #{cmd_args}"
         | 
| 256 323 | 
             
                execute(cmd)
         | 
| 257 324 | 
             
              end
         | 
| 258 | 
            -
             | 
| 325 | 
            +
              
         | 
| 326 | 
            +
              # Runs UVM test simulation on an elaborated testbench snapshot using xrun.
         | 
| 327 | 
            +
              #
         | 
| 328 | 
            +
              # @return [void]
         | 
| 329 | 
            +
              #
         | 
| 330 | 
            +
              # @since 0.8.0
         | 
| 259 331 | 
             
              def self.run_sim
         | 
| 260 332 | 
             
                cmd_args = @config[:simulation][:args]
         | 
| 261 333 | 
             
                if @args[:wave]
         | 
| @@ -263,10 +335,12 @@ module Rvvm | |
| 263 335 | 
             
                else
         | 
| 264 336 | 
             
                  cmd_args << "-R"
         | 
| 265 337 | 
             
                end
         | 
| 266 | 
            -
             | 
| 338 | 
            +
                
         | 
| 339 | 
            +
                # Run simulaton on an array of tests.
         | 
| 340 | 
            +
                # If in not running in batch mode testlist is an array with a single test
         | 
| 267 341 | 
             
                test = @args[:test] || @config[:simulation][:defTest]
         | 
| 268 | 
            -
                # TODO: parse test list
         | 
| 269 342 | 
             
                testlist = [test]
         | 
| 343 | 
            +
                testlist = @args[:testlist] || @config[:simulation][:testlist] if @args[:batch] || @config[:simulation][:batch] == 1
         | 
| 270 344 |  | 
| 271 345 | 
             
                tb = @args[:simtb] || @args[:tb] || @config[:elaboration][:tb]
         | 
| 272 346 |  | 
| @@ -276,7 +350,7 @@ module Rvvm | |
| 276 350 | 
             
                  puts "RVvM: Running test #{i + 1}/#{testlist.size}: #{simtest}"
         | 
| 277 351 |  | 
| 278 352 | 
             
                  logname = File.join([@config[:project][:logDir], @config[:simulation][:logDir], @config[:simulation][:log]])
         | 
| 279 | 
            -
                  logname = Utils. | 
| 353 | 
            +
                  logname = Utils.interpolate(logname, { testname: simtest })
         | 
| 280 354 |  | 
| 281 355 | 
             
                  verb = "UVM_#{@args[:verb] || @config[:simulation][:verbosity]}"
         | 
| 282 356 |  | 
| @@ -285,6 +359,11 @@ module Rvvm | |
| 285 359 | 
             
                end
         | 
| 286 360 | 
             
              end
         | 
| 287 361 |  | 
| 362 | 
            +
              # Runs a pure SystemVerilog/Verilog simulation using xrun.
         | 
| 363 | 
            +
              #
         | 
| 364 | 
            +
              # @return [void]
         | 
| 365 | 
            +
              #
         | 
| 366 | 
            +
              # @since 0.9.0
         | 
| 288 367 | 
             
              def self.run_sv
         | 
| 289 368 | 
             
                cmd_args = @config[:simulation][:args]
         | 
| 290 369 | 
             
                tb = @args[:simtb] || @args[:tb] || @config[:elaboration][:tb]
         | 
| @@ -295,24 +374,47 @@ module Rvvm | |
| 295 374 | 
             
                cmd = "xsim #{tb} -log #{logname} #{cmd_args}"
         | 
| 296 375 | 
             
                execute(cmd)
         | 
| 297 376 | 
             
              end
         | 
| 298 | 
            -
             | 
| 377 | 
            +
              
         | 
| 378 | 
            +
              # Opens last generated waveform trace dump to inspect in Vivado GUI.
         | 
| 379 | 
            +
              #
         | 
| 380 | 
            +
              # @return [void]
         | 
| 381 | 
            +
              #
         | 
| 382 | 
            +
              # @since 0.9.0
         | 
| 299 383 | 
             
              def self.gui
         | 
| 300 384 | 
             
                dump = @args[:wavefile] || "#{@config[:elaboration][:tb]}.wdb"
         | 
| 301 385 |  | 
| 302 386 | 
             
                cmd = "xsim --gui #{dump}"
         | 
| 303 387 | 
             
                execute(cmd)
         | 
| 304 388 | 
             
              end
         | 
| 305 | 
            -
             | 
| 389 | 
            +
              
         | 
| 390 | 
            +
              # Generates UVM test functional coverage report using xcrg.
         | 
| 391 | 
            +
              #
         | 
| 392 | 
            +
              # @return [void]
         | 
| 393 | 
            +
              #
         | 
| 394 | 
            +
              # @since 0.9.0
         | 
| 306 395 | 
             
              def self.coverage
         | 
| 307 396 | 
             
                cmd = "xcrg -report_format html -dir xsim.covdb"
         | 
| 308 397 | 
             
                execute(cmd)
         | 
| 309 398 | 
             
              end
         | 
| 310 | 
            -
             | 
| 399 | 
            +
              
         | 
| 400 | 
            +
              # Opens last generated functional coverage report in a HTML dashboard.
         | 
| 401 | 
            +
              #
         | 
| 402 | 
            +
              # @return [void]
         | 
| 403 | 
            +
              #
         | 
| 404 | 
            +
              # @since 0.9.0
         | 
| 311 405 | 
             
              def self.cov_report
         | 
| 312 406 | 
             
                Dir.chdir("xcrg_func_cov_report")
         | 
| 313 407 | 
             
                execute("./dashboard.html")
         | 
| 314 408 | 
             
              end
         | 
| 315 | 
            -
             | 
| 409 | 
            +
              
         | 
| 410 | 
            +
              # Generates a SystemVerilog module/interface template.
         | 
| 411 | 
            +
              #
         | 
| 412 | 
            +
              # @param type [String] specifies modudle/itf
         | 
| 413 | 
            +
              # @param name [String] specifies module/itf name
         | 
| 414 | 
            +
              #
         | 
| 415 | 
            +
              # @return [void]
         | 
| 416 | 
            +
              #
         | 
| 417 | 
            +
              # @since 0.9.0
         | 
| 316 418 | 
             
              def self.create_module(type, name)
         | 
| 317 419 | 
             
                conf = @templates[:module][:conf]
         | 
| 318 420 | 
             
                conf[:module] = name
         | 
| @@ -329,7 +431,14 @@ module Rvvm | |
| 329 431 |  | 
| 330 432 | 
             
                exit(0)
         | 
| 331 433 | 
             
              end
         | 
| 332 | 
            -
             | 
| 434 | 
            +
              
         | 
| 435 | 
            +
              # Generates a SystemVerilog package template.
         | 
| 436 | 
            +
              #
         | 
| 437 | 
            +
              # @param name [String] specifies package name
         | 
| 438 | 
            +
              #
         | 
| 439 | 
            +
              # @return [void]
         | 
| 440 | 
            +
              #
         | 
| 441 | 
            +
              # @since 0.9.0
         | 
| 333 442 | 
             
              def self.create_pkg(name)
         | 
| 334 443 | 
             
                conf = @templates[:package][:conf]
         | 
| 335 444 | 
             
                conf[:package] = name
         | 
| @@ -345,7 +454,14 @@ module Rvvm | |
| 345 454 |  | 
| 346 455 | 
             
                exit(0)
         | 
| 347 456 | 
             
              end
         | 
| 348 | 
            -
             | 
| 457 | 
            +
              
         | 
| 458 | 
            +
              # Generates a generic SystemVerilog template file.
         | 
| 459 | 
            +
              #
         | 
| 460 | 
            +
              # @param name [String] specifies template name
         | 
| 461 | 
            +
              #
         | 
| 462 | 
            +
              # @return [void]
         | 
| 463 | 
            +
              #
         | 
| 464 | 
            +
              # @since 0.9.0
         | 
| 349 465 | 
             
              def self.create_svfile(name)
         | 
| 350 466 | 
             
                conf = @templates[:svfile][:conf]
         | 
| 351 467 | 
             
                conf[:NAME] = name.upcase
         | 
| @@ -360,7 +476,12 @@ module Rvvm | |
| 360 476 |  | 
| 361 477 | 
             
                exit(0)
         | 
| 362 478 | 
             
              end
         | 
| 363 | 
            -
             | 
| 479 | 
            +
              
         | 
| 480 | 
            +
              # Runs rvvm calling its methods based on provided script args.
         | 
| 481 | 
            +
              #
         | 
| 482 | 
            +
              # @return [void]
         | 
| 483 | 
            +
              #
         | 
| 484 | 
            +
              # @since 0.8.0
         | 
| 364 485 | 
             
              def self.run
         | 
| 365 486 | 
             
                create_new_project(@args[:new]) if @args[:new]
         | 
| 366 487 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rvvm
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.9. | 
| 4 | 
            +
              version: 0.9.3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - mrbya
         | 
| @@ -26,6 +26,7 @@ files: | |
| 26 26 | 
             
            - LICENSE.txt
         | 
| 27 27 | 
             
            - README.md
         | 
| 28 28 | 
             
            - Rakefile
         | 
| 29 | 
            +
            - bin/sandbox
         | 
| 29 30 | 
             
            - exe/rvvm
         | 
| 30 31 | 
             
            - lib/rvvm.rb
         | 
| 31 32 | 
             
            - lib/rvvm/templates.rb
         |