Skip to content

Commit 1c080df

Browse files
authored
Merge pull request #3 from JimKnowler/feature-cmake
Feature cmake
2 parents c4c75ff + 4b046c8 commit 1c080df

34 files changed

+197
-189
lines changed

.bazelrc

Lines changed: 0 additions & 7 deletions
This file was deleted.

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
/bazel-*
1+
/build
22
.DS_Store

BUILD

Lines changed: 0 additions & 1 deletion
This file was deleted.

CMakeLists.txt

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
cmake_minimum_required(VERSION 3.31.6)
2+
3+
project(googletest-verilog
4+
VERSION 0.2.0
5+
LANGUAGES CXX
6+
)
7+
8+
set(CMAKE_CXX_STANDARD 20)
9+
10+
#
11+
# GoogleTest Library
12+
#
13+
14+
# download google test
15+
include(FetchContent)
16+
FetchContent_Declare(
17+
googletest
18+
URL https://github.com/google/googletest/releases/download/v1.17.0/googletest-1.17.0.tar.gz
19+
)
20+
21+
# prevent googletest from overriding our compiler/linker options
22+
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
23+
FetchContent_MakeAvailable(googletest)
24+
25+
#
26+
# Verilator library
27+
#
28+
29+
# based on verilator documentation
30+
# https://veripool.org/guide/latest/verilating.html#cmake
31+
32+
find_package(verilator REQUIRED HINTS $ENV{VERILATOR_ROOT})
33+
34+
message(STATUS "VERILATOR_ROOT = ${VERILATOR_ROOT}")
35+
message(STATUS "VERILATOR_BIN = ${VERILATOR_BIN}")
36+
37+
#
38+
# googletest-verilog test bench generation
39+
#
40+
41+
find_package(Python3 COMPONENTS Interpreter REQUIRED)
42+
43+
function(googletest_verilog_testbench TB_TARGET)
44+
cmake_parse_arguments(
45+
TB # prefix
46+
"" # list of options (true / false based on whether option is present or not)
47+
"SOURCE" # single value keywords
48+
"INCLUDE_DIRS" # multi-value keywords
49+
${ARGN} # arguments provided to the function
50+
)
51+
52+
message(STATUS "SOURCE = ${TB_SOURCE}")
53+
message(STATUS "TARGET = ${TB_TARGET}")
54+
message(STATUS "INCLUDE_DIRS = ${TB_INCLUDE_DIRS}")
55+
56+
get_filename_component(TB_SOURCE_BASENAME "${TB_SOURCE}" NAME_WE)
57+
set(TB_TESTBENCH "${TB_SOURCE_BASENAME}TestBench")
58+
59+
set(TB_VERILATED_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/verilated/${TB_TESTBENCH})
60+
set(TB_TESTBENCH_HEADER "${TB_VERILATED_OUTPUT_DIR}/${TB_TESTBENCH}.h")
61+
set(TB_TESTBENCH_SOURCE "${TB_VERILATED_OUTPUT_DIR}/${TB_TESTBENCH}.cpp")
62+
63+
message(STATUS "TB_TESTBENCH = ${TB_TESTBENCH}")
64+
message(STATUS "TB_VERILATED_OUTPUT_DIR = ${TB_VERILATED_OUTPUT_DIR}")
65+
message(STATUS "TB_TESTBENCH_HEADER = ${TB_TESTBENCH_HEADER}")
66+
message(STATUS "TB_TESTBENCH_SOURCE = ${TB_TESTBENCH_SOURCE}")
67+
message(STATUS "CMAKE_BINARY_DIR = " ${CMAKE_BINARY_DIR})
68+
message(STATUS "CMAKE_CURRENT_BINARY_DIR = " ${CMAKE_CURRENT_BINARY_DIR})
69+
70+
# 1. verilate the verilog module
71+
72+
verilate(${TB_TARGET} SOURCES ${TB_SOURCE} INCLUDE_DIRS ${TB_INCLUDE_DIRS} DIRECTORY ${TB_VERILATED_OUTPUT_DIR})
73+
74+
# 2. generate test bench
75+
set(TOOL_GENERATE_TESTBENCH ${CMAKE_SOURCE_DIR}/tools/generate_testbench.py)
76+
77+
add_custom_command(
78+
OUTPUT ${TB_TESTBENCH_HEADER} ${TB_TESTBENCH_SOURCE}
79+
COMMAND ${Python3_EXECUTABLE} ${TOOL_GENERATE_TESTBENCH} --name ${TB_TESTBENCH} --verilated-header-dir ${TB_VERILATED_OUTPUT_DIR} --output-header ${TB_TESTBENCH_HEADER} --output-source ${TB_TESTBENCH_SOURCE}
80+
DEPENDS ${TOOL_GENERATE_TESTBENCH} ${TB_SOURCE}
81+
)
82+
83+
target_sources(${TB_TARGET} PRIVATE ${TB_TESTBENCH_HEADER} ${TB_TESTBENCH_SOURCE})
84+
85+
set(TB_TESTBENCH_TARGET "googletest_verilog_testbench-${TB_TESTBENCH}")
86+
87+
# 3. use a custom target to force cmake to create testbench first, before compiling TARGET
88+
89+
add_custom_target(${TB_TESTBENCH_TARGET}
90+
DEPENDS ${TB_TESTBENCH_HEADER} ${TB_TESTBENCH_SOURCE}
91+
)
92+
93+
add_dependencies(${TB_TARGET} ${TB_TESTBENCH_TARGET})
94+
95+
endfunction()
96+
97+
#
98+
# googletest-verilog static library
99+
#
100+
101+
include_directories(include)
102+
103+
add_library(googletest-verilog
104+
src/ConsoleColour.cpp
105+
src/MatchesTrace.cpp
106+
src/PortDescription.cpp
107+
src/Step.cpp
108+
src/Trace.cpp
109+
src/TraceBuilder.cpp
110+
)
111+
112+
# add googletest/googlemock includes, without linking to gtest
113+
get_target_property(GTEST_INCLUDES GTest::gtest INTERFACE_INCLUDE_DIRECTORIES)
114+
get_target_property(GMOCK_INCLUDES GTest::gmock INTERFACE_INCLUDE_DIRECTORIES)
115+
target_include_directories(googletest-verilog PUBLIC ${GTEST_INCLUDES} ${GMOCK_INCLUDES})
116+
117+
#
118+
# googletest-verilog internal Unit Tests
119+
#
120+
121+
add_executable(googletest-verilog-test
122+
test/main.cpp
123+
test/MatchesTrace.test.cpp
124+
test/Step.test.cpp
125+
test/TestBench.test.cpp
126+
test/Trace.test.cpp
127+
test/TraceBuilder.test.cpp
128+
)
129+
130+
target_link_libraries(googletest-verilog-test
131+
gtest
132+
gmock
133+
googletest-verilog
134+
)
135+
136+
#
137+
# googletest-verilog Example Usage
138+
#
139+
140+
add_executable(googletest-verilog-example
141+
example/main.cpp
142+
example/Counter.test.cpp
143+
)
144+
145+
googletest_verilog_testbench(googletest-verilog-example SOURCE example/Counter.v)
146+
147+
target_link_libraries(googletest-verilog-example PRIVATE
148+
googletest-verilog
149+
gtest
150+
gmock
151+
)
152+
153+
target_include_directories(googletest-verilog-example PRIVATE ${VERILATOR_INCLUDE_DIRS})

README.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
1-
- bazel build //gtestverilog:test && ./bazel-bin/gtestverilog/test --gtest_filter="*"
1+
# googletest-verilog
22

3-
- bazel build //gtestverilog:example --incompatible_require_linker_input_cc_api=false && ./bazel-bin/gtestverilog/example --gtest_filter="*"
3+
Add support for writing C++ unit-tests for verilog modules with [googletest](https://github.com/google/googletest).
44

5+
Unit-tests are run in simulation with [verilator](https://github.com/verilator/verilator).
6+
7+
# Dependencies
8+
9+
MacOS - to install with homebrew:
10+
11+
``` brew
12+
brew install verilator cmake
13+
```

WORKSPACE

Lines changed: 0 additions & 42 deletions
This file was deleted.

gtestverilog/example/Counter.test.cpp renamed to example/Counter.test.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
#include <gtest/gtest.h>
22
using namespace testing;
33

4-
#include "gtestverilog/gtestverilog.h"
4+
#include "gtest-verilog/gtest-verilog.h"
55
using namespace gtestverilog;
66

7-
#include "gtestverilog/CounterTestBench.h"
7+
#include "CounterTestBench.h"
88
using namespace countertestbench;
99

1010
namespace {
@@ -88,4 +88,4 @@ TEST_F(Counter, ShouldHandleLargeTraces) {
8888
.port(i_simulate_sequential).signal( "10" ).repeat(1001);
8989

9090
ASSERT_THAT(testBench.trace, MatchesTrace(traceExpected));
91-
}
91+
}
File renamed without changes.
File renamed without changes.

gtestverilog/BUILD

Lines changed: 0 additions & 64 deletions
This file was deleted.

0 commit comments

Comments
 (0)