Commit graph

1821 commits

Author SHA1 Message Date
Philipp Wagner
6912b21fc7 Remove Verible lint workaround
Verible lint now supports waivers without regex and line arguments. Use
this new feature and remove the workaround we had in place.

Signed-off-by: Philipp Wagner <phw@lowrisc.org>
2020-07-30 12:19:27 +01:00
Pirmin Vogel
597070400d [dv] Add custom CSRs to yaml description file
This is related to lowRISC/ibex#1038.

Signed-off-by: Pirmin Vogel <vogelpi@lowrisc.org>
2020-07-24 19:39:22 +02:00
Udi
c9331c0e34 [dv/ibex] Update CSR listings
This PR updates the `implemented_csrs` list in `riscv_core_setting.sv`
and adds the two custom CSRs `cpuctrl` and `secureseed` to the
`custom_csrs` list. Both are for use by the riscv-dv generator.

Signed-off-by: Udi <udij@google.com>
2020-07-24 10:10:21 -07:00
Udi
216ba1a42d Update google_riscv-dv to google/riscv-dv@3cf691d
Update code from upstream repository https://github.com/google/riscv-
dv to revision 3cf691dcb96f2cd72250690216b60f2b0c0ac804

* remove hardcoded CSR names (Udi Jonnalagadda)
* initial custom CSR support (Udi Jonnalagadda)
* Add support for segmented load/store instructions (google/riscv-
  dv#656) (taoliug)
* fix post_randomize issue (aneels3)
* add MAX_LMUL to rv32i config (google/riscv-dv#649) (udinator)
* Ignore log and asm file (aneels3)
* Add Command Line Support (aneels3)
* support for command-line arguments (pvipsyash)
* Reorder import statements (aneels3)
* Modified function randomize_gpr in instr_stream file
  (ShraddhaDevaiya)
* Updated riscv_instr_sequence file and modified other python files to
  get main block in asm file. (ShraddhaDevaiya)
* Modify get_rand_instr() (aneels3)
* added uvm_glob_to_re in uvm_re_match (Dawid Zimonczyk)
* Aldec Riviera-PRO compiler command line arguments modified.
  (google/riscv-dv#638) (Dariusz Stachańczyk)
* allow coverage compilation to be run on LSF (google/riscv-dv#637)
  (udinator)
* Add CHIPS Alliance work group information to the README
  (google/riscv-dv#633) (taoliug)
* Add indexed/strided vector load/store instrution stream
  (google/riscv-dv#632) (taoliug)
* Add constraint for mtvec alignment in vectored interrupt mode
  (google/riscv-dv#631) (taoliug)
* Add bitstring requirement to pygen/experimental README
  (google/riscv-dv#630) (taoliug)
* Add unsupported load/store instruction filtering (google/riscv-
  dv#629) (taoliug)
* Add different methods to initialize the vregs (google/riscv-dv#627)
  (Josep Sans)
* Support a vetor instruction only mode (google/riscv-dv#626)
  (taoliug)
* Add riscv_instr_stream.py file (aneels3)
* Importing PyVSC module (google/riscv-dv#625) (Hodjat Asghari
  Esfeden)
* update pygen_src files (google/riscv-dv#612) (BharathNR1030)
* Fix typo (google/riscv-dv#624) (taoliug)
* Fix B-ext instruction generation issue (google/riscv-dv#620)
  (taoliug)

Signed-off-by: Udi <udij@google.com>
2020-07-24 00:09:07 -07:00
Rupert Swarbrick
46ff63ad88 Properly vendor in mem_model from OpenTitan
This removes the manually copied version at dv/uvm/core_ibex/common
and vendors things properly now that the vendor tool supports such
things (this picks up the same OpenTitan version as the previous
commit: lowRISC/opentitan@067272a2).
2020-07-24 08:05:40 +01:00
Rupert Swarbrick
e37c81a1c1 Update lowrisc_ip to lowRISC/opentitan@067272a2
Update code from upstream repository
https://github.com/lowRISC/opentitan to revision
067272a253f4eeed4ae58a9171ee266256528117

* [dv/common] initial support for shadow register (Cindy Chen)
* [rtl/prince] Small fixes for PRINCE cipher logic (Udi Jonnalagadda)
* [dv doc] Fix rendered testplan table (Srikrishna Iyer)
* [prim/dv] Enable coverage collection for PRESENT (Udi Jonnalagadda)
* [dvsim/syn] Minor fix in message reporting (Michael Schaffner)
* [prim] Make prim_clock_inverter a tech specific prim (Michael
  Schaffner)
* [vsg] fix _i/_o for several modules (Scott Johnson)
* [doc] Update Licence Headers to fit agreed style (Sam Elliott)
* [vsg] fix _i/_o usage on sram_arbiter (Scott Johnson)
* [vsg] fix _i/_o usage on prim_fifo (Scott Johnson)
* switch to host, primary, or over-arching as appropriate (Scott
  Johnson)
* [dvsim/lint/syn] Properly set the errors_seen value to return
  nonzero status (Michael Schaffner)
* [dvsim] Fix open() call with Pathlib for older Python versions
  (Michael Schaffner)
* [style-lint] Last round of minor fixes to get all targets clean
  (Michael Schaffner)
* [prim] Add shadow register primitive (Pirmin Vogel)
* [flash_ctrl] Cosmetic updates enum literals (Srikrishna Iyer)
* [tool/script] delete clean section in make files (Cindy Chen)
* [dvsim] Add git commit and branch info to reports (Michael
  Schaffner)
* [dvsim/syn/lint] Add options to selectively sanitize reports
  (Michael Schaffner)
* [lint] Update waiver file for prim_generic_pad_wrapper (Michael
  Schaffner)
* [prim_pad_wrapper] Update pad wrapper (Michael Schaffner)
* [alert_handler/rtl] priority between ping_ok and sig_int_err (Cindy
  Chen)
* [prim] Add a few prim cells needed for clock / resets (Timothy Chen)
* [dv] added default timeout message to DV_SPINWAIT (Srikrishna Iyer)
* [dv] Add mechanism to configure vseq via knobs (Srikrishna Iyer)
* Make the wmask assertion in prim_generic_ram_*p only apply to writes
  (Rupert Swarbrick)
* [prim_gate_gen] Recalibrate gate generator for new std cells
  (Michael Schaffner)
* [primgen] Use SafeDumper for YAML (Philipp Wagner)
* [primgen] Fix some flake8-reported style issues (Philipp Wagner)
* [prim] Improve extraction of parameter port list (Philipp Wagner)
* [prim] Remove outdated comment from primgen (Philipp Wagner)
* Added missing include prim_assert.sv (Dawid Zimonczyk)

Signed-off-by: Rupert Swarbrick <rswarbrick@lowrisc.org>
2020-07-24 08:05:40 +01:00
Rupert Swarbrick
94d5057168 Track mem_err_shift better in the ICache scoreboard
This fixes a test failure that I was seeing when following a "many
errors" test by something different. To reproduce,

  make -C dv/uvm/icache/dv \
       SEED=1465832714 \
       TESTS=ibex_icache_stress_all_with_reset

There are actually two different ways this can come unstuck:

(1) Memory request goes out and gets put into the response queue.
    req_i goes low. Sequence changes. req_i goes high and we get the
    response from the previous request (but mem_err_shift has changed
    in the meantime).

    To fix this, we pair up the memory seed and its associated
    mem_err_shift in the scoreboard queue, rather than retrieving
    mem_err_shift from the config object when the response comes in.

(2) Memory request goes out. Sequence changes. Memory request is
    handled (with new mem_err_shift). Scoreboard sees the result. New
    sequence generates its first item.

    In this case, the scoreboard will expect the old mem_err_shift and
    see the new one. To fix this, we add an extra entry to the list of
    valid states in the scoreboard if needed so that we also check the
    mem_err_shift currently in the config object.

You might worry about what happens if we have two back-to-back
sequence changes that change mem_err_shift without ever changing seed:
what happens if we have a situation like (1), but for the "middle"
sequence. To avoid this problem, we actually add the extra entry in
the fix for (2), so it will look like a new seed arrived as part of
the middle sequence, so long as we have read at least one
result (always true in the core sequence).
2020-07-22 21:09:40 +01:00
Rupert Swarbrick
84bcf4973a Minor rejigs to Makefile dvsim wrapper
This now allows you to specify how many seeds to run. Sadly, you can't
say "give me 10 seeds, starting at 1234" because dvsim doesn't support
that at the moment. But it does at least avoid quite such long command
lines.

Instead of:

    ../../../../vendor/lowrisc_ip/dvsim/dvsim.py \
      ibex_icache_sim_cfg.hjson \
      --scratch-root ../../../../build \
      --reseed 5 \
      -c

you can run:

    make RESEED=5 COVERAGE=1
2020-07-22 21:09:40 +01:00
Rupert Swarbrick
e8d86ecb96 Remove duplicated files from dv/uvm/core_ibex/common/utils
We now have a clock/reset interface and the dv_utils stuff vendored
from OpenTitan so can delete the duplicates and point the file list at
the vendored files.

The only difficulty is that the clock interfaces are slightly
different, so there are a couple of minor changes to the core_ibex
test lib, renaming "clk_if" to "clk_rst_if" and changing how we apply
resets.

Note that the testbench (core_ibex_tb_top.sv) starts the clock and
resets the DUT at the start of time. This is different from how other
OpenTitan VIP does things (where the reset happens in the sequence),
but this is the smallest change I could make from how it worked
before (where the reset happened in the clock interface itself).
2020-07-22 21:09:25 +01:00
Rupert Swarbrick
1dda6401c3 Define an Ibex-specific top_pkg core
The idea is that this can supply top_pkg.sv, a top-level thing in
OpenTitan, for DV code we vendor from there. It's probably better to
do this than to directly vendor in OpenTitan's top_pkg, because the
latter has information about e.g. flash memory layout, which doesn't
really have any meaning for Ibex.
2020-07-22 21:09:25 +01:00
Rupert Swarbrick
c5cd7d6819 [dvsim] Print a more helpful path to coverage dashboard
cov_report_page is used by dvsim's SimCfg.py to print a message to the
console with the path to the dashboard HTML page. Most of these
messages have the full path (useful for copy-pasting), but this one
didn't.

This is essentially a duplicate of OpenTitan PR 2934[1] (because we're
not able to vendor these files properly yet).

[1] https://github.com/lowRISC/opentitan/pull/2934
2020-07-22 21:08:38 +01:00
Pirmin Vogel
d7c13aa904 [dv] Fix typos
These typos cause compilation failures.

Signed-off-by: Pirmin Vogel <vogelpi@lowrisc.org>
2020-07-20 10:29:30 +02:00
Udi
1619ea2bc7 [dv/ibex] Enhance riscv_debug_single_step test
As pointed out by @tomroberts-lowrisc in #983, the current
implementation of riscv_debug_single_step_test cannot handle
single-stepping over instructions that change the PC.
This PR aims to introduce this functionality, utilizing the
new instr_monitor_if.

Now, if the core single-steps onto a branch/jump instruction, the
testbench will log the new target PC and compare it against the actual
target address stored in `dpc`.
"Normal" instructions are checked as usual by incrementing the
instruction's PC by either 2 or 4 (depending whether it is compressed)
and comparing that against `dpc`.
2020-07-17 11:15:13 -07:00
Pirmin Vogel
7f9e704f36 [rtl] Make sure decoder also checks bits 26 and 25 for slli, srli, srai
Previously, these bits were not checked when decoding slli, srli and
srai, causing some illegal instruction encodings not to trigger an
illegal instructions exception.

This resolves lowRISC/Ibex#1018.

Signed-off-by: Pirmin Vogel <vogelpi@lowrisc.org>
2020-07-17 17:05:36 +02:00
Tom Roberts
03a8ae70d6 [rtl] Add security hardened PC
- Checks that PC increments as expected
- Raises an alert if not

Signed-off-by: Tom Roberts <tomroberts@lowrisc.org>
2020-07-16 15:00:05 +01:00
Udi
93d920118c [dv/ibex] Switch to request/response terminology
This PR modifies the Ibex DV environment to use request/response
terminology instead of the current outdated naming scheme.
These changes are purely aesthetic.
2020-07-15 09:29:02 -07:00
Tom Roberts
c542edbb1a [rtl] Add register-file ECC checking
- Add SECDED ECC checking to the register file when SecureIbex is
  enabled
- No correction is attempted, but an alert is raised for the system to
  intervene

Signed-off-by: Tom Roberts <tomroberts@lowrisc.org>
2020-07-15 09:50:23 +01:00
Tom Roberts
aae437d75b [rtl] Add alert outputs
- Add a major and minor alert output which can be used by the system to
  react to fault injection attacks

Signed-off-by: Tom Roberts <tomroberts@lowrisc.org>
2020-07-15 09:50:23 +01:00
Tom Roberts
a9642cfb48 [params] Add SecureIbex option to simple system
Signed-off-by: Tom Roberts <tomroberts@lowrisc.org>
2020-07-15 09:50:23 +01:00
Greg Chadwick
6b9165fa66 [doc] Update READMEs with best CoreMark results 2020-07-10 13:49:19 +01:00
Greg Chadwick
adafa73ca8 [sw] Enable choice of -march= string for CoreMark 2020-07-10 13:49:19 +01:00
Dawid Zimonczyk
1dfddee5e6 Value passed to UVM set_timeout is calculated as 1000000000 basing on 1ns/1ps timescale.
But if you are using precompiled UVM it may be compiled with other timescale depending on compilation option used when it was compiled or tools default timescale value (uvm does not set timescale int the code).
In this case for us precompiled UVM timescale is 1ps/1ps - so UVM gets 1000000000 in set timeout but interprets it as ps. As a result timeout is 1000 times smaller that you expect. That is why we are getting timeouts.
It is hard to find perfect solution. One of them is to recompile the UVM with -timescale 1ns/ps (or whatever you will use for your design).
2020-07-10 10:56:03 +01:00
Dawid Zimonczyk
14f85d3ee3 update readme for Riviera-PRO 2020-07-10 10:29:24 +01:00
Dawid Zimonczyk
9208689c21 correct wrong assignment to enum 2020-07-09 18:12:28 +01:00
Philipp Wagner
4223803d22 Lint: Fix some line length warnings
AscentLint complains about lines longer than 100 characters, as seen in
the nightly lint reports. Fix some (all?) of them.
2020-07-09 13:42:33 +01:00
Philipp Wagner
d0923fa5d1 ibex_counter: Use always_ff
Fix a lint error reported by AscentLint:

```
E   ALWAYS_SPEC:   ibex_counter.sv:59   Edge triggered block may be more accurately modeled as always_ff                 New
```
2020-07-09 13:42:33 +01:00
Philipp Wagner
3d29e5174c Enforce lint of simple system in CI
The existing setup had a couple mixups in them which failed them to be
effective.
2020-07-07 16:21:48 +01:00
Philipp Wagner
85d0ce36cb Specify data type for all parameters in simple_system
Fixes a lint warning.
2020-07-07 16:21:48 +01:00
Philipp Wagner
f688c79565 Clarifications to the README of the simple system
* Mention the need to install `libelf-dev`. Thanks to Bert Pieters for
  reporting this.
* Guide users to install our Python dependencies, including fusesoc and
  edalize, from `python-requirements.txt`, to ensure they have the
  right version.
* Prefer ELF files for Verilator simulations. This makes it easier to
  use existing ELF files from another software build system.

Fixes #1019
2020-07-07 15:35:55 +01:00
Philipp Wagner
c476329608 Only include necessary LFSR primitive
We previously had a dependency on all primitives in Ibex, even though we
only depend on the LFSR primitive. Now that there's a more fine-grained
dependency available, we can use that.

This has the great benefit of restricting all lint tools to only the
code we're interested in, and not linting all primitives in OpenTitan
together with Ibex. This also helps tools like yosys, which aren't able
to parse all of OpenTitan's code yet.
2020-07-07 15:21:32 +01:00
Philipp Wagner
ee0a1cf2ce Update lowrisc_ip to lowRISC/opentitan@ebf4663b
Update code from upstream repository
https://github.com/lowRISC/opentitan to revision
ebf4663b42a9d81d026db5821b5c8249d54f23a7

* [prim_lfsr] Fix description in core file for FPV (Philipp Wagner)
* [prim_lfsr] Factor out into a separate core file (Philipp Wagner)

Signed-off-by: Philipp Wagner <phw@lowrisc.org>
2020-07-07 15:21:32 +01:00
Udi
75dadb5aef [dv/ibex] Add two new interrupt/debug tests
As a result of lowRISC/opentitan#2405 and lowRISC/ibex#928 (reporting
that interrupts that came in while a load instruction was in the ID
stage caused some incorrect behavior in Ibex), this PR adds some new
directed interrupt and debug tests to check that the core behaves
properly during execution of each supported instruction when some
external irq/debug stimulus comes in.

To do this, we use the two new functions `decode_instr(...)` and
`decode_compressed_instr(...)` in `core_ibex_test_list.sv` to "decode"
every instruction that the `core_ibex_instr_monitor_if` sees in the ID
stage of the pipeline. Once the testbench decodes an instruction that
we have not seen before, it can then drive interrupt or debug stimulus
into the core.

Once any given instruction has been detected by the testbench (and
stimulus driven), it will no longer drive stimulus if this instruction
is seen in the decode pipeline (e.g. if we have previously detected a
`c.addi` instruction in the ID stage and have driven irq/debug stimulus,
we will no longer drive stimulus if we see another `c.addi` instruction,
no matter the operands). This is to avoid driving irq/debug stimulus
after every single instruction as this will add a huge unwanted amount
of simulation latency.

A few notes:

- We drive irq/debug stimulus into the core every time we see a
  `wfi` instruction, as otherwise we will timeout as the core waits
  infinitely for some stimulus from the outside world.
- We ignore some system-level instructions (ebreak/mret/dret) and
  illegal instructionsfor now, as driving stimulus during these
  instructions will result in a nested trap, which requires special
  handling.
- The interrupt agent was modified slightly to drive stimulus by
  default on the falling edge of the clock, so this way we can "catch"
  instructions that are in the ID pipeline for only a single cycle.
- The duration for which the testbench raises `debug_req_i` for the core
  is also increased to avoid edge cases where we lower the debug line
  too early (e.g. while long multicycle instructions like `div` are
  executing in the ID stage).
2020-07-06 17:50:59 -07:00
Pirmin Vogel
414ff7eeb0 [doc] Fix spelling of CoreMark
Signed-off-by: Pirmin Vogel <vogelpi@lowrisc.org>
2020-07-06 12:30:02 +02:00
Rupert Swarbrick
d7284c2cbd Handle --help properly in simple_system top-level 2020-07-06 10:31:58 +01:00
Rupert Swarbrick
45d3790d40 Update lowrisc_ip to lowRISC/opentitan@9ac4f9c8
Update code from upstream repository
https://github.com/lowRISC/opentitan to revision
9ac4f9c8b924b79eb7d3581b29346a612f705751

* Allow verilated top-levels to do work after a simulation completes
  (Rupert Swarbrick)
* Add some missing dependencies on lowrisc:prim:assert (Rupert
  Swarbrick)

Signed-off-by: Rupert Swarbrick <rswarbrick@lowrisc.org>
2020-07-06 10:31:58 +01:00
Philipp Wagner
f98ddabee1 Use the Xilinx primitives for the Arty board
Use Xilinx-specific implementations for primitives, such as RAM and the
clock gate (which will now be implemented using a BUFGCE macro, and no
longer with a latch).

Verified in Vivado synthesis to pick up the Xilinx primitive now.
2020-07-06 10:20:39 +01:00
Pirmin Vogel
ede658b92a [doc] Clarify that the supported version of the B extension is a draft
Support for this extension is not experimental (it's fully verified using
RISCV-DV) but the extension might change before being ratified.

Signed-off-by: Pirmin Vogel <vogelpi@lowrisc.org>
2020-07-05 13:52:56 +02:00
Philipp Wagner
0335b69e26 Clean up Verilator sections in core files
- The "PINCONNECTEMPTY" waiver is part of our normal waiver file, no need
  to add it to the tool invocation.
- Recent versions of Verilator choose good defaults for MAKE_OPTS,
  passing it explicitly overrides the settings.
- All Verilator code is now lint clean, we can remove `-Wno-fatal`.
- FST traces are not much slower then VCD traces any more in recent
  Verilator versions, remove the respective comment.
- Align comment about the compile/sim time for tracing with other files
  and OpenTitan.
2020-07-03 17:54:41 +01:00
Philipp Wagner
9e3bec0dc6 Fix and waive Verilator lint errors in tb_cs_registers
Add a waiver for top-level parameters passed in through the command
line, and fix the use within the file.
2020-07-03 17:54:41 +01:00
Philipp Wagner
9bd09c0b74 Remove lowrisc:prim:clock_gating from shared core collections
The clock gating primitive is now a dependency of the
lowrisc:ibex:ibex_core file directly and only used in there, we can
remove it from the simulation or FPGA dependency collections.
2020-07-03 17:08:02 +01:00
Philipp Wagner
465ea2806c Add lint for ibex_simple_system to CI 2020-07-03 16:18:31 +01:00
Philipp Wagner
a10df87daa ibex_simple_system: Add lint target 2020-07-03 16:18:31 +01:00
Philipp Wagner
3bc105492f Simplify lint targets
The only core which needs lint waivers is ibex_core.core; it will then
inherit those waivers to other cores, such as ibex_core_tracing.core,
and higher-up users of these cores (such as the simple system).

Also remove the Verible lint configuration, which happens to be the
default by now. This fixes #736 by making it unnecessary.
2020-07-03 16:18:31 +01:00
Philipp Wagner
c436ea1b1b Remove unrelated files from lint in ibex_core_tracing
The lint target in ibex_core_tracing was used to also lint unrelated
files which are needed for some simulations (e.g. the simple system).
Remove them from there, as they really don't belong there.
2020-07-03 16:18:31 +01:00
Philipp Wagner
89e525ecc8 Add dependency on prim_clock_gating
Ibex depends on a clock gating primitive. This has always been the case;
previously, we have under-specified the dependency list by simply not
including this dependency. This is problematic not only because "IT'S
WRONG!", but also because it breaks self-contained targets, like
Verilator lint, which cannot run on ibex_core or ibex_core_tracing
without having a way to find the clock gating primitive.
2020-07-03 16:18:31 +01:00
Philipp Wagner
a126e4ce98 Fix Ibex description in core file
Ibex has moved on since these descriptions were written.
2020-07-03 16:18:31 +01:00
Philipp Wagner
dbc1f259af icache: Depend on prim_assert
The file ibex_icache.sv is using the assert macros, we need to depend on
them.
2020-07-03 16:18:31 +01:00
Rupert Swarbrick
006617f95a Fix SRAM initialisation for fpga/artya example
This now gets passed to the underlying primitive as a
parameter (instead of a define).
2020-07-03 16:06:48 +01:00
Rupert Swarbrick
7b6ba11a58 Drop SRAM_INIT_FILE from ibex_riscv_compliance.core
This no longer works anyway. It isn't needed for Verilator-based
simulations, and the RISCV compliance suite doesn't support any tool
but Verilator.
2020-07-03 16:06:48 +01:00
Rupert Swarbrick
a8cc0a9ef6 Get simple_system working for VCS
This should probably work for Riviera-PRO too, but that hasn't been
tested.
2020-07-03 15:42:39 +01:00