blob: b4bf80ecfd62bcdbdd05f6cb6e2321dcdf69502d [file] [log] [blame] [view]
---
layout: documentation
title: Compiling a SLICC protocol
doc: Learning gem5
parent: part3
permalink: /documentation/learning_gem5/part3/MSIbuilding/
author: Jason Lowe-Power
---
Compiling a SLICC protocol
==========================
The SLICC file
--------------
Now that we have finished implementing the protocol, we need to compile
it. You can download the complete SLICC files below:
- [MSI-cache.sm](/_pages/static/scripts/part3/MSI\_protocol/MSI-cache.sm)
- [MSI-dir.sm](/_pages/static/scripts/part3/MSI\_protocol/MSI-dir.sm)
- [MSI-msg.sm](/_pages/static/scripts/part3/MSI\_protocol/MSI-msg.sm)
Before building the protocol, we need to create one more file:
`MSI.slicc`. This file tells the SLICC compiler which state machine
files to compile for this protocol. The first line contains the name of
our protocol. Then, the file has a number of `include` statements. Each
`include` statement has a file name. This filename can come from any of
the `protocol_dirs` directories. We declared the current directory as
part of the `protocol_dirs` in the SConsopts file
(`protocol_dirs.append(str(Dir('.').abspath))`). The other directory is
`src/mem/protocol/`. These files are included like C++h header files.
Effectively, all of the files are processed as one large SLICC file.
Thus, any files that declare types that are used in other files must
come before the files they are used in (e.g., `MSI-msg.sm` must come
before `MSI-cache.sm` since `MSI-cache.sm` uses the `RequestMsg` type).
```cpp
protocol "MSI";
include "RubySlicc_interfaces.slicc";
include "MSI-msg.sm";
include "MSI-cache.sm";
include "MSI-dir.sm";
```
You can download the fill file
[here](/_pages/static/scripts/part3/MSI_protocol/MSI.slicc).
Compiling a protocol with SCons
-------------------------------
Most SCons defaults (found in `build_opts/`) specify the protocol as
`MI_example`, an example, but poor performing protocol. Therefore, we
cannot simply use a default build name (e.g., `X86` or `ARM`). We have
to specify the SCons options on the command line. The command line below
will build our new protocol with the X86 ISA.
```
scons build/X86_MSI/gem5.opt --default=X86 PROTOCOL=MSI SLICC_HTML=True
```
This command will build `gem5.opt` in the directory `build/X86_MSI`. You
can specify *any* directory here. This command line has two new
parameters: `--default` and `PROTOCOL`. First, `--default` specifies
which file to use in `build_opts` for defaults for all of the SCons
variables (e.g., `ISA`, `CPU_MODELS`). Next, `PROTOCOL` *overrides* any
default for the `PROTOCOL` SCons variable in the default specified.
Thus, we are telling SCons to specifically compile our new protocol, not
whichever protocol was specified in `build_opts/X86`.
There is one more variable on this command line to build gem5:
`SLICC_HTML=True`. When you specify this on the building command line,
SLICC will generate the HTML tables for your protocol. You can find the
HTML tables in `<build directory>/mem/protocol/html`. By default, the
SLICC compiler skips building the HTML tables because it impacts the
performance of compiling gem5, especially when compiling on a network
file system.
After gem5 finishes compiling, you will have a gem5 binary with your new
protocol! If you want to build another protocol into gem5, you have to
change the `PROTOCOL` SCons variable. Thus, it is a good idea to use a
different build directory for each protocol, especially if you will be
comparing protocols.
When building your protocol, you will likely encounter errors in your
SLICC code reported by the SLICC compiler. Most errors include the file
and line number of the error. Sometimes, this line number is the line
*after* the error occurs. In fact, the line number can be far below the
actual error. For instance, if the curly brackets do not match
correctly, the error will report the last line in the file as the
location.