├── .gitignore ├── LICENSE ├── Makefile ├── README.md ├── alu.sv ├── doc ├── alu_expected_waveform.wavedrom ├── alu_tb_transactional.drawio ├── alu_tb_transactional.jpg ├── alu_tb_transactional_2.jpg ├── basic_tb_transactional.drawio ├── coffeemachine.drawio ├── interface.drawio ├── monitor.drawio ├── scoreboard.drawio ├── transaction_generator.drawio ├── transaction_item.drawio ├── valid_check_xournal.pdf └── valid_check_xournal.xoj ├── gtkwave_setup.gtkw └── tb_alu.cpp /.gitignore: -------------------------------------------------------------------------------- 1 | obj_dir 2 | .stamp.verilate 3 | waveform.vcd -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Norbertas Kremeris 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # Verilator example makefile 2 | # Norbertas Kremeris 2021 3 | MODULE=alu 4 | 5 | .PHONY:sim 6 | sim: waveform.vcd 7 | 8 | .PHONY:verilate 9 | verilate: .stamp.verilate 10 | 11 | .PHONY:build 12 | build: obj_dir/Valu 13 | 14 | .PHONY:waves 15 | waves: waveform.vcd 16 | @echo 17 | @echo "### WAVES ###" 18 | gtkwave waveform.vcd -a gtkwave_setup.gtkw 19 | 20 | waveform.vcd: ./obj_dir/V$(MODULE) 21 | @echo 22 | @echo "### SIMULATING ###" 23 | ./obj_dir/V$(MODULE) +verilator+rand+reset+2 24 | 25 | ./obj_dir/V$(MODULE): .stamp.verilate 26 | @echo 27 | @echo "### BUILDING SIM ###" 28 | make -C obj_dir -f V$(MODULE).mk V$(MODULE) 29 | 30 | .stamp.verilate: $(MODULE).sv tb_$(MODULE).cpp 31 | @echo 32 | @echo "### VERILATING ###" 33 | verilator -Wall --trace --x-assign unique --x-initial unique -cc $(MODULE).sv --exe tb_$(MODULE).cpp 34 | @touch .stamp.verilate 35 | 36 | .PHONY:lint 37 | lint: $(MODULE).sv 38 | verilator --lint-only $(MODULE).sv 39 | 40 | .PHONY: clean 41 | clean: 42 | rm -rf .stamp.*; 43 | rm -rf ./obj_dir 44 | rm -rf waveform.vcd 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Verilator example sources for Verilog/SystemVerilog verification with C++ 2 | 3 | The sources in this repository contain an Arithmetic Logic Unit (ALU, *alu.sv*) writen in SystemVerilog as the Device-Under-Test (DUT), a Verilator C++ testbench (*alu_tb.cpp*), and an accompanying Makefile to build, simulate and display waveforms. 4 | 5 | Dependencies: you need to have verilator, gtkwave, gcc, make installed on your system. 6 | Written and tested primarily under Arch Linux, known to be working on Ubuntu 20.04 and 18.04. 7 | 8 | To simulate the testbench, simply run `make` in the root of the repo. 9 | To draw waveforms, run `make waves`. 10 | 11 | You can find beginner friendly Verilator tutorials here: 12 | 13 | * [Verilator Tutorial Pt.1: Introduction](https://www.itsembedded.com/dhd/verilator_1/) 14 | * [Verilator Tutorial Pt.2: Basics of SystemVerilog verification using C++](https://www.itsembedded.com/dhd/verilator_2/) 15 | * [Verilator Tutorial Pt.3: Traditional style verification example](https://www.itsembedded.com/dhd/verilator_3/) 16 | * [Verilator Tutorial Pt.4: Modern transactional (UVM) style C++ testbench](https://www.itsembedded.com/dhd/verilator_4/) 17 | 18 | Please visit the links above or www.itsembedded.com for more info. 19 | 20 | 21 | Below are the tags you can check out: 22 | * **verilator_pt1** for a minimal testbench source that simply builds and generates a clock signal to the DUT 23 | * **verilator_pt2** is based on verilator_pt1 testbench with a reset method and some primitive verification functionality 24 | * **verilator_pt3** is based on verilator_pt2 testbench and has a traditional (sequential, time based) verification example. 25 | * **verilator_pt4** is a transactional (UVM) style testbench with a transaction generator, driver, monitors and scoreboard implemented in raw C++. 26 | 27 | ``` 28 | git clone https://github.com/n-kremeris/verilator_basics 29 | git checkout 30 | ``` 31 | 32 | 33 | 34 | 35 | Norbertas Kremeris 2021 36 | -------------------------------------------------------------------------------- /alu.sv: -------------------------------------------------------------------------------- 1 | /* 2 | * Primitive alu example for Verilator example 3 | * 4 | * File name: alu.sv 5 | * Author: Norbertas Kremeris 2021 6 | * 7 | */ 8 | typedef enum logic [1:0] { 9 | add = 2'h1, 10 | sub = 2'h2, 11 | nop = 2'h0 12 | } operation_t /*verilator public*/; 13 | 14 | module alu #( 15 | parameter WIDTH = 6 16 | ) ( 17 | input clk, 18 | input rst, 19 | 20 | input operation_t op_in, 21 | input [WIDTH-1:0] a_in, 22 | input [WIDTH-1:0] b_in, 23 | input in_valid, 24 | 25 | output logic [WIDTH-1:0] out, 26 | output logic out_valid 27 | ); 28 | 29 | operation_t op_in_r; 30 | logic [WIDTH-1:0] a_in_r; 31 | logic [WIDTH-1:0] b_in_r; 32 | logic in_valid_r; 33 | logic [WIDTH-1:0] result; 34 | 35 | // Register all inputs 36 | always_ff @ (posedge clk, posedge rst) begin 37 | if (rst) begin 38 | op_in_r <= '0; 39 | a_in_r <= '0; 40 | b_in_r <= '0; 41 | in_valid_r <= '0; 42 | end else begin 43 | op_in_r <= op_in; 44 | a_in_r <= a_in; 45 | b_in_r <= b_in; 46 | in_valid_r <= in_valid; 47 | end 48 | end 49 | 50 | // Compute the result 51 | always_comb begin 52 | result = '0; 53 | if (in_valid_r) begin 54 | case (op_in_r) 55 | add: result = a_in_r + b_in_r; 56 | sub: result = a_in_r + (~b_in_r+1'b1); 57 | default: result = '0; 58 | endcase 59 | end 60 | end 61 | 62 | // Register outputs 63 | always_ff @ (posedge clk, posedge rst) begin 64 | if (rst) begin 65 | out <= '0; 66 | out_valid <= '0; 67 | end else begin 68 | out <= result; 69 | out_valid <= in_valid_r; 70 | end 71 | end 72 | 73 | endmodule; 74 | -------------------------------------------------------------------------------- /doc/alu_expected_waveform.wavedrom: -------------------------------------------------------------------------------- 1 | {signal: [ 2 | {name: 'clk', wave: 'p......'}, 3 | {name: 'op_in', wave: 'xx22xxx', data: ['add','sub']}, 4 | {name: 'a_in', wave: 'xx33xxx', data: ['2','4']}, 5 | {name: 'b_in', wave: 'xx44xxx', data: ['3','1']}, 6 | {name: 'in_valid', wave: '0.1.0..', data: ['3','1'], 7 | node: '.......'}, 8 | 9 | {}, 10 | {name: 'op_in_r', wave: 'x..22x.', data: ['add','sub']}, 11 | {name: 'a_in_r', wave: 'xxx33xx', data: ['2','4']}, 12 | {name: 'b_in_r', wave: 'xxx44xx', data: ['3','1']}, 13 | {name: 'in_valid_r', wave: '0..1.0.'}, 14 | {name: 'result', wave: 'xxx55xx', data: ['5','3']}, 15 | 16 | {}, 17 | {name: 'out', wave: 'xxxx55x', data: ['5','3']}, 18 | {name: 'out_valid', wave: '0...1.0'}, 19 | 20 | ], 21 | config: { hscale:2}, 22 | head: { text: ['tspan', {class:'info h3'}, 'ALU expected behavior'] } 23 | } 24 | -------------------------------------------------------------------------------- /doc/alu_tb_transactional.drawio: -------------------------------------------------------------------------------- 1 | 3Vptc6M2EP41nmk74xtA5sUf47drbi5JL8ldL586MsiYC0ZUyImdX18JhEGAHWyDHTeeyaCV0Ns+u89qRQcMF6vPBIbzG+wgv6MpzqoDRh1NMyyD/eeCdSIwlX4icInnJCIlEzx4bygRqql06TkoErJERDH2qRfKQhsHAbKpJIOE4Fe52Qz7jiQIoYtKggcb+mXp355D54nU0pVM/ify3Hk6sqqImim0n12Cl4EYr6MBdaSp2jCpXsC0L9E+mkMHv+ZEYNwBQ4IxTZ4WqyHy+dbK2zbZUruZN0EBrfMCvPn5MrpV35x/Ft9oOIHWc/+5K3qJ6DrdD+Sw7RFFTOgcuziA/jiTDuI1I96rwkpZm68Yh0yoMuEvROla6BouKWaiOV34onaGAyoqVSDKQ+xjEs8ATCampnF5RAl+RlU15bWnC8FLYouVhN6Pp/EX5X72xf1mKcNft6PpY1cXEIPERXRHO1XAmm9HbgSxtZ8RXiBK1qwBQT6k3ouMJihA6W7aiVevCIHrXIMQewGNcj3/xQWsgTAvjXfHexTWBYyCkvdrzx6SGaSl3FIyUQycPUAkhnyB/lJsw4jwHWFOYUm7Hc2ACwaMgcv2e+AFf3DNeUG0kQfTKNzotIDEr3DK3I2EHuh7bsCebaZ7xIAxeEGEesygr0TFwnOcBKgo8t7gNO6PQ1VsNutcH3T0UQUSfT7cYGPYOegJ0y6B1bbtSjzusjY+YbSq8m5ispKHkNAm3lI+mYpiSppOtbAfHksAMoxCr5bcA57NImY4Mqb2RdEuy8yh6Orrdya4vmVI8Tl2pkQCiPHvkvvOWCPdKNbiFWuggnAVqyStZ08x9Eb31z/G9yWYye7sde5R9BDC2Im8MsZ7x3V5vl8DJce4tBJatqJCFcaeKk+zRPk1IzY1paN5jtR6ynaYSGreV6faWfiF7SBZ/xTvx4UnXvikp8XRKl85WotSxFiBXvGYggkCHKBUNvH4suM273CXwv4mk5a4y6jLXb0PwV3AKsARNMtFlWsHoOxG/OV18Li6TH4ZG/xXCZudFnc8x3SZwRgmkOlAbYRkgNyreSqKMdqmmJu72+vHu/8zxwDtw3GMeVaO2RTa45gDvIbCtb55FRMHkbR6M2gRJVp/HL9zOEFZl0VQRhHLJyGoXhVB3S3pxTDUdkzVPBvtNONGiMs0dPl01MzhqCfjJeWT9onLKmEmJSy+5Sn7JGR29/3xADbbTmVJV2za+aFOw3CHeK8iK77r1epzn/7hzlcqOAf3nTN/p2o1OUZvmmKOC1LKFnzRx5K9XHuK0ibyXszq+rITbuhI0pN7Bady7Smgc8i4h4GDF+X8aCNHFEpgEEGbejhoqEcXBYhAyqCxnRTUCz/2FFNrar+m69dbc/3lOFKOCZhtpVuRaQyoDpunXVbig40JmmJInLqMz+bohRF6X7EwCpOLu5m34mAoabqkuUzXMgY0MFCaIvNeDY1aFQq1WlNoOQF+mEIrTDm7q+yKTrhFE3f6G2CjshUNuYGbxuZZ0/XfyyBJAsxRFmC2GhXWYKWzIKfoC3q9MnIMpQI6RgPQqbxX0s8RBWZZ9izp8ZSv25IBOWv0WDeF/jFuf4sZdGD281jZt307t7/lpOoNDrw4HNjz/jeLRrZRziWHxrsst4nImIUfahuRsalJveonC4zLwNqe9Dgog1/it2uOnxnnpzb4zYHRfBMM1412t3vBmrA7nt6UMr0B9aQZ/t4l8VsDt8hnSt+rZk12tD4EOxbT90BO3+/bvqV0f/l4v4se8ZLm+PFoh3YhDNrSjUJ6Qm7iRkG1LPnLqGZuFMzC51Yn+9oqtfVTXilcBL1uuUdojF517X163VDpkfTKitn3xQlysm+4wfg/ -------------------------------------------------------------------------------- /doc/alu_tb_transactional.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n-kremeris/verilator_basics/7cdd5829d88c8f1024fea7f7685214dbe34d5aaf/doc/alu_tb_transactional.jpg -------------------------------------------------------------------------------- /doc/alu_tb_transactional_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n-kremeris/verilator_basics/7cdd5829d88c8f1024fea7f7685214dbe34d5aaf/doc/alu_tb_transactional_2.jpg -------------------------------------------------------------------------------- /doc/basic_tb_transactional.drawio: -------------------------------------------------------------------------------- 1 | 3VrbcuI4EP0aqnYfmLIsbJxHwiWbqVxmkszu5GlL2MJoYiyPLBLI148EEr7IEEgMJEkesFoXS+rTfVotN2B3MjtjKBlf0gBHDdsKZg3Ya9g2aAFP/EjJfCnxHLAUhIwES5GVCW7JM1Y9tXRKApwq2VLEKY04SYpCn8Yx9nlBhhijT8VmIxoFBUGCQmwIbn0UmdL/SMDHehVWJv8Hk3Cs3wwsVTNE/kPI6DRW72vYEPRsYHeX1ROkx1Lt0zEK6FNOBPsN2GWU8uXTZNbFkdzb4rYN1tSu5s1wzLfpgC5/PvauwHPw/+Q7TwbIezh5aKpRUj7X+4EDsT2qSBkf05DGKOpn0tPFmrEc1RKlrM0FpYkQAiH8hTmfK12jKadCNOaTSNWOaMxVJYCq3KURZYsZwMGgbdtSnnJGH3BVjbl2vRA6Zb5aSUL+ve9/tW5GX8PvntX9ddUb3jUdBTHEQsw3tAPusqHcjtwb1NaeYTrBnM1FA4YjxMljEU1IgTJctVNdO4yhea5BQknM09zI36RANFD2Zcvh5IjKuqBbUvJu7cXDcga6lFtKJloAZwcQqVc+omiqtqHHyCOJw4aEpBuJfT4dMvEUyicxX8xGSGipqjYhcVqJyQs0FJ6ngCMUkTAWzz6WQwrBI2acCNPuqIoJCYIlZHFKntFwMZ4Erdp2Mbhz2nB6FZiM5OtOVyauQRjTGJuI9X2/EpSbTE7OFc8KqFEuTs2z4CYKkFO9rC9ty2oX1K1VsRsoDRTBVnFUXdYj0NEoFdZTBNauUNpkniUoCeXalumqio7oaUw4vk3QwvyfBFnV7XRGJIpKOFjrhwztrtUiUBaqN9v2VPkpYyOgOWScY6KWtV6tBbXsqgP7KKQgdpDNf6r+i8K9LHxxdLE3y1f25qqUClfOOzIQyNSykA2IXPaizQu6t8TfYLAnwnG3JZzWuyAc6JXgCOslkMq1Q2iY/R1DcYp8TmhsksQ5x5MPRxJ9V/5XYmmjGb6dKJrCitw2LPp0sA+mgIfiCdcAzCWNCaefmCig/e6Ion1UogD7J4o1Bp4d9UwrtyQQVl0pCzArYcEEjn3SX/R5Pct4H4tl3DKWD8Iyrc/IMutxtuUhZaNp10I+bdcpHlPqOaU0oVekNO9Q7OMZQNLokXuu8dO5+CEaXf+4y0MrhyX395TqPs10ofCOpC+YzLJKPdjl9dX53fWNHkpMO/+qehnvNa6rzJIr+V640Hl3hyYAj8GFx8ykAXtLznHqppy3BS2m8W5kAfGLJtJg4mEqf8iHYIW3+H4N5ToyVMI0T4pOup5zR6t8mjlYhkrDflv8nOEYM7Q4mZSrqmS3+PcUxzI5utajg497hiknuwAA2/nt9t78thkUFrlcYF7vTsbJEARinr5J07c+ZXhIEQu2ZWoxR5Kk+GWdojRZ3n+NyEziwFCyoczsjJJTppDb8NTafN7YXqOtskZPTCb2KhTq7U2hZgr5dQqtiNSyK7+mGkQGbCwc/gXFW8WKujJ+a7urZ9tx/jZB0iuGhCueOVRkt/E8exQUlf1Cq2WiyLUqYOTWAKPKWxrnGOFclgPPshn3+bo1qY2jhoHbJrjfx4VqOb8N2yd5rOzafj8Xqmuzm4s7VSNPkV2olqu+ffrbVO3ta4hVwSp1XHOOvBir2geLVE0YnV/d9W8GnW6/8eY0eYDS8SocfTEUyeLKKl0fJthsWSapQHDQhHnrI7FKDTerR8qGg/aWnOS9C04qZ8NhMRu+a/s9Zc/Nc++nJqU95dX1cbOOvDrwPLeKWt7KV6Vvig6WVtdm+0JePU9i9oEOUjuy3Zqs+D7ZzrFfZrsVs72R7UQx+251qf3s42DY/wM= -------------------------------------------------------------------------------- /doc/interface.drawio: -------------------------------------------------------------------------------- 1 | 7VjRbtowFP0aHjvFNgnhEQLdKm2rVipNe3SJSbI6uanjQNjXz8E2IWJFoKJBJEAi9rn29fU9PjZxjwRp9VnQPP4GIeM97IRVj0x6GPvIUb81sNZA3/c0EIkk1JDTALPkD9Og7ReVScgKg2lIAnCZ5G1wDlnG5rKFUSFg1W62AB62gJxGbA+YzSnfR38moYzNtFynwb+wJIrtyMgxlhc6f40ElJkZr4cJmmCEA21OqfVl2hcxDWG1A5FpjwQCQOpSWgWM16ltp+3+Hes2bsEyeUyHX4tg8DBZv31fTqZ8cP/8A4/iO8+QVci1TQgLVX5MNYNMPcabWbLaj6NqIGQMEWSUfwXIFYgU+JtJuTbs0lKCgmKZcmPVg9Se3w3eQAWUYs4OROy6ZpFQETF5qKG/TbJauwxSJsVadRSMU5ks25FQs4qibbsmk6pgknlCYm2YS8pLZheIx1XA4wWoOe+m3HsrwRruik0OR6oBwnnVGFUpqp/PgmYFncsEMuvwRVjjg2SpRVXYeiRt2uN5FSeSzXK6yfZKabtNGS1yLbdFUtXUjwsp4JUFwEFsHJBg89m6XjIhWXWY3302TAeXDHUXs4t4xsOqkeSAaCjeUaPFzk+f/2H6cP9f9M2Cx6fp+HH0NDmWJxWt2gtrGZ6PsUXC+Q6Oaf09D5MEtZlEnr9HJbJnxC6XW/DsZHpu5za5YTc2ueFtkztBGhiRq9rkrDK7owvP6YQubJg3XRx5+PdbuiA+ubAwBp0Thn11unJhoJswThHGsH1gqLfrT+6FpTHsnDRwN6SBb9L4wH+pi58ZA2cvYdcujH43hNG/CeMEYSB7dfE/zgxVbS4wN7adS2Iy/Qs= -------------------------------------------------------------------------------- /doc/monitor.drawio: -------------------------------------------------------------------------------- 1 | 7VrBcpswEP0aH+NBEhj7SMBuM20zbeJOklOHGhmYYORgObb79RUgATK4TcfBMAUOCVrBA+2+J60XDZC52n+I7LX3hTg4GEDF2Q+QNYBwDBT2NzYcUoM6HqUGN/Kd1KTkhnv/F06N4j536zt4w22piRISUH8tGxckDPGCSjY7ishOvmxJAkcyrG0Xlwz3CzsoWx98h3p8WJqS2z9i3/XEk4HCe37ai2c3ItuQP28AEbAggGbavbIFFr9+49kO2RVMaDpAZkQITc9WexMHsWtlt81O9GbvHeGQvuWGp6Wp31iHl9tXaxros/k3aHhXQE9hXu1gi8U4RgEDvF4Shstemx64q0YvWyI6rjZJIA12AVTX+7yTnbnxf+v7XACxV0qx0h7ujQwWJj7E8VsC1r3zfIrv1/Yi7t0xyjGbR1cB7+aviyOK9ycdATL3MtZissI0OrBL+A2qDtNbOGPBSEvbuzz+QETNK8QeIk5tm3POzbBzv7MT7vp/CAOEFWE4chMOHSPmO2uFJMSyW/Dep4/x+VCBov3E2soQxK5I2lY8fkU0DoXGVxz5bCA4EraQDeqx2JCwYkMOlrQOxdYxXDoU7JSE+NeIFSKiVQRE2CIc2NR/leGrgsSf8JX4CbcFIRR9qMmcgEAbKgqaZAeSQTdkGy0wxymK7hhar8JVlezQZFxqRy6mJdyEVJlfzuAZ6nnWLp4hpR6eJbjN8UztedYunqk1zWdqo/MZKq+b5udPP4wS2Vi2QGWGbWhEnrFJAhLlDFz6QXBksgPfDVlzwWIbM+A6zj18lj8avGPlO078mMrMJc9tcuKcl7wAJCcvk1EpeVGrchelptRF5ESFEExvuxQB9pOg4QiUc3jDsu46FQPYtArG/YLXrgVPm8gL3jutdwmsetlFblLilmXMjU7pW214jhUP6/XdFn3rqBZ9J7CX1bfgdoFbD3c382mnBK6Va3CXFXhfgWuXwBGoZQFPYS8s8L7q1jJuIbUWbiWwF+ZWX2lrGbfUeuYttYF5SytxK66ulb/g/bdpCRIfextLSyqra12KAGg6MTxRXetSDFDTKuiray1b5Ea1/PpOYS+8yJ2ornVJ32rDc6zWV9dapm9dr0XfCexl9a2dqq51SeDapGGBv6W6FgT+enPKR4WgVPhfjtMAohk7GGvRtWNvvGxv4Tu4Fo41ybVgXP4yAeGk7FsA/iDM85xbVV6S9nAuMsfk2zTRkh2xsI93bt7czqd3M8OcshuNt+7hbId03jvYSJHnr6rPzGInzZk6Ys18K3A69+XbrdH0Nw== -------------------------------------------------------------------------------- /doc/transaction_generator.drawio: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /doc/transaction_item.drawio: -------------------------------------------------------------------------------- 1 | ddHNEoIgEADgp+HOT814R6tLJw+dSUiZ0HUQR+vp0wEypjoB3y4LLIjxdj5a0TdnkMogiuWMWI4oJTuSLcMqDy/ZnniorZae8AalfqqwM+qopRqCeXIAxuk+xQq6TlUuMWEtTGnaDYxMoBe1+oKyEuZbL1q6Jr4Cb35Sum7iyQSHyFVU99rC2IXzEGUkp4RyH25FrBXyh0ZImD6IFYhxC+D8rJ25Mmtv07Yd/kTf97aqcz82LJOt9rJIPpAVLw== -------------------------------------------------------------------------------- /doc/valid_check_xournal.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n-kremeris/verilator_basics/7cdd5829d88c8f1024fea7f7685214dbe34d5aaf/doc/valid_check_xournal.pdf -------------------------------------------------------------------------------- /doc/valid_check_xournal.xoj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n-kremeris/verilator_basics/7cdd5829d88c8f1024fea7f7685214dbe34d5aaf/doc/valid_check_xournal.xoj -------------------------------------------------------------------------------- /gtkwave_setup.gtkw: -------------------------------------------------------------------------------- 1 | [*] 2 | [*] GTKWave Analyzer v3.3.109 (w)1999-2020 BSI 3 | [*] Sat Sep 25 18:51:58 2021 4 | [*] 5 | [dumpfile] "/home/toby/NO-SYNC/server_backup/verilator_basics/waveform.vcd" 6 | [dumpfile_mtime] "Sat Sep 25 18:47:21 2021" 7 | [dumpfile_size] 5168 8 | [savefile] "/home/toby/NO-SYNC/server_backup/verilator_basics/gtkwave_setup.gtkw" 9 | [timestart] 0 10 | [size] 1189 655 11 | [pos] -1 -1 12 | *-6.610580 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 13 | [treeopen] TOP. 14 | [sst_width] 253 15 | [signals_width] 177 16 | [sst_expanded] 1 17 | [sst_vpaned_height] 154 18 | @28 19 | TOP.alu.clk 20 | TOP.alu.rst 21 | @200 22 | - 23 | @22 24 | TOP.alu.a_in[5:0] 25 | TOP.alu.b_in[5:0] 26 | @28 27 | TOP.alu.in_valid 28 | TOP.alu.op_in[1:0] 29 | @200 30 | - 31 | @22 32 | TOP.alu.out[5:0] 33 | @28 34 | TOP.alu.out_valid 35 | [pattern_trace] 1 36 | [pattern_trace] 0 37 | -------------------------------------------------------------------------------- /tb_alu.cpp: -------------------------------------------------------------------------------- 1 | // Verilator Example 2 | // Norbertas Kremeris 2021 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include "Valu.h" 10 | #include "Valu___024unit.h" 11 | 12 | #define MAX_SIM_TIME 300 13 | #define VERIF_START_TIME 7 14 | vluint64_t sim_time = 0; 15 | vluint64_t posedge_cnt = 0; 16 | 17 | // ALU input interface transaction item class 18 | class AluInTx { 19 | public: 20 | uint32_t a; 21 | uint32_t b; 22 | enum Operation { 23 | add = Valu___024unit::operation_t::add, 24 | sub = Valu___024unit::operation_t::sub, 25 | nop = Valu___024unit::operation_t::nop 26 | } op; 27 | }; 28 | 29 | // ALU output interface transaction item class 30 | class AluOutTx { 31 | public: 32 | uint32_t out; 33 | }; 34 | 35 | // ALU scoreboard 36 | class AluScb { 37 | private: 38 | std::deque in_q; 39 | 40 | public: 41 | // Input interface monitor port 42 | void writeIn(AluInTx *tx){ 43 | // Push the received transaction item into a queue for later 44 | in_q.push_back(tx); 45 | } 46 | 47 | // Output interface monitor port 48 | void writeOut(AluOutTx* tx){ 49 | // We should never get any data from the output interface 50 | // before an input gets driven to the input interface 51 | if(in_q.empty()){ 52 | std::cout <<"Fatal Error in AluScb: empty AluInTx queue" << std::endl; 53 | exit(1); 54 | } 55 | 56 | // Grab the transaction item from the front of the input item queue 57 | AluInTx* in; 58 | in = in_q.front(); 59 | in_q.pop_front(); 60 | 61 | switch(in->op){ 62 | // A valid signal should not be created at the output when there is no operation, 63 | // so we should never get a transaction item where the operation is NOP 64 | case AluInTx::nop : 65 | std::cout << "Fatal error in AluScb, received NOP on input" << std::endl; 66 | exit(1); 67 | break; 68 | 69 | // Received transaction is add 70 | case AluInTx::add : 71 | if (in->a + in->b != tx->out) { 72 | std::cout << std::endl; 73 | std::cout << "AluScb: add mismatch" << std::endl; 74 | std::cout << " Expected: " << in->a + in->b 75 | << " Actual: " << tx->out << std::endl; 76 | std::cout << " Simtime: " << sim_time << std::endl; 77 | } 78 | break; 79 | 80 | // Received transaction is sub 81 | case AluInTx::sub : 82 | if (in->a - in->b != tx->out) { 83 | std::cout << std::endl; 84 | std::cout << "AluScb: sub mismatch" << std::endl; 85 | std::cout << " Expected: " << in->a - in->b 86 | << " Actual: " << tx->out << std::endl; 87 | std::cout << " Simtime: " << sim_time << std::endl; 88 | } 89 | break; 90 | } 91 | // As the transaction items were allocated on the heap, it's important 92 | // to free the memory after they have been used 93 | delete in; 94 | delete tx; 95 | } 96 | }; 97 | 98 | // ALU input interface driver 99 | class AluInDrv { 100 | private: 101 | Valu *dut; 102 | public: 103 | AluInDrv(Valu *dut){ 104 | this->dut = dut; 105 | } 106 | 107 | void drive(AluInTx *tx){ 108 | // we always start with in_valid set to 0, and set it to 109 | // 1 later only if necessary 110 | dut->in_valid = 0; 111 | 112 | // Don't drive anything if a transaction item doesn't exist 113 | if(tx != NULL){ 114 | if (tx->op != AluInTx::nop) { 115 | // If the operation is not a NOP, we drive it onto the 116 | // input interface pins 117 | dut->in_valid = 1; 118 | dut->op_in = tx->op; 119 | dut->a_in = tx->a; 120 | dut->b_in = tx->b; 121 | } 122 | // Release the memory by deleting the tx item 123 | // after it has been consumed 124 | delete tx; 125 | } 126 | } 127 | }; 128 | 129 | // ALU input interface monitor 130 | class AluInMon { 131 | private: 132 | Valu *dut; 133 | AluScb *scb; 134 | public: 135 | AluInMon(Valu *dut, AluScb *scb){ 136 | this->dut = dut; 137 | this->scb = scb; 138 | } 139 | 140 | void monitor(){ 141 | if (dut->in_valid == 1) { 142 | // If there is valid data at the input interface, 143 | // create a new AluInTx transaction item and populate 144 | // it with data observed at the interface pins 145 | AluInTx *tx = new AluInTx(); 146 | tx->op = AluInTx::Operation(dut->op_in); 147 | tx->a = dut->a_in; 148 | tx->b = dut->b_in; 149 | 150 | // then pass the transaction item to the scoreboard 151 | scb->writeIn(tx); 152 | } 153 | } 154 | }; 155 | 156 | // ALU output interface monitor 157 | class AluOutMon { 158 | private: 159 | Valu *dut; 160 | AluScb *scb; 161 | public: 162 | AluOutMon(Valu *dut, AluScb *scb){ 163 | this->dut = dut; 164 | this->scb = scb; 165 | } 166 | 167 | void monitor(){ 168 | if (dut->out_valid == 1) { 169 | // If there is valid data at the output interface, 170 | // create a new AluOutTx transaction item and populate 171 | // it with result observed at the interface pins 172 | AluOutTx *tx = new AluOutTx(); 173 | tx->out = dut->out; 174 | 175 | // then pass the transaction item to the scoreboard 176 | scb->writeOut(tx); 177 | } 178 | } 179 | }; 180 | 181 | // ALU random transaction generator 182 | // This will allocate memory for an AluInTx 183 | // transaction item, randomise the data, and 184 | // return a pointer to the transaction item object 185 | AluInTx* rndAluInTx(){ 186 | //20% chance of generating a transaction 187 | if(rand()%5 == 0){ 188 | AluInTx *tx = new AluInTx(); 189 | tx->op = AluInTx::Operation(rand() % 3); // Our ENUM only has entries with values 0, 1, 2 190 | tx->a = rand() % 11 + 10; // generate a in range 10-20 191 | tx->b = rand() % 6; // generate b in range 0-5 192 | return tx; 193 | } else { 194 | return NULL; 195 | } 196 | } 197 | 198 | 199 | void dut_reset (Valu *dut, vluint64_t &sim_time){ 200 | dut->rst = 0; 201 | if(sim_time >= 3 && sim_time < 6){ 202 | dut->rst = 1; 203 | dut->a_in = 0; 204 | dut->b_in = 0; 205 | dut->op_in = 0; 206 | dut->in_valid = 0; 207 | } 208 | } 209 | 210 | int main(int argc, char** argv, char** env) { 211 | srand (time(NULL)); 212 | Verilated::commandArgs(argc, argv); 213 | Valu *dut = new Valu; 214 | 215 | Verilated::traceEverOn(true); 216 | VerilatedVcdC *m_trace = new VerilatedVcdC; 217 | dut->trace(m_trace, 5); 218 | m_trace->open("waveform.vcd"); 219 | 220 | AluInTx *tx; 221 | 222 | // Here we create the driver, scoreboard, input and output monitor blocks 223 | AluInDrv *drv = new AluInDrv(dut); 224 | AluScb *scb = new AluScb(); 225 | AluInMon *inMon = new AluInMon(dut, scb); 226 | AluOutMon *outMon = new AluOutMon(dut, scb); 227 | 228 | while (sim_time < MAX_SIM_TIME) { 229 | dut_reset(dut, sim_time); 230 | dut->clk ^= 1; 231 | dut->eval(); 232 | 233 | // Do all the driving/monitoring on a positive edge 234 | if (dut->clk == 1){ 235 | 236 | if (sim_time >= VERIF_START_TIME) { 237 | // Generate a randomised transaction item of type AluInTx 238 | tx = rndAluInTx(); 239 | 240 | // Pass the transaction item to the ALU input interface driver, 241 | // which drives the input interface based on the info in the 242 | // transaction item 243 | drv->drive(tx); 244 | 245 | // Monitor the input interface 246 | inMon->monitor(); 247 | 248 | // Monitor the output interface 249 | outMon->monitor(); 250 | } 251 | } 252 | // end of positive edge processing 253 | 254 | m_trace->dump(sim_time); 255 | sim_time++; 256 | } 257 | 258 | m_trace->close(); 259 | delete dut; 260 | delete outMon; 261 | delete inMon; 262 | delete scb; 263 | delete drv; 264 | exit(EXIT_SUCCESS); 265 | } 266 | --------------------------------------------------------------------------------