[prim/packer] Enhance the behavior based on FPV result

Problem 1:

    `prim_packer` did not assert `valid_o` even it has enough data to
    send out on some corner case when `ready_i` is de-asserted.

Lost the previous commit message. So let it be short. `prim_packer` is
a primitive module to pack incoming data with mask into `OutW` bit-width
signal and send out to the output port.

While preparing FPV environment, a new assertion was added:

    // If input mask is greater than output width, valid should be
    // asserted
    `ASSERT(ValidOAssertedForInputGTEOutW_A,
            valid_i && ($countones(mask_i) >= OutW) |-> valid_o,
            clk_i, !rst_ni)

FPV catches a corner case based on this assertion. When the output port
lowered `ready_i`, the module stores incoming request into the internal
registers. Then it increases `pos` pointer value by `InW`. At the next
cycle, it is expected to keep asserting the `valid_o` as it has data to
send out. As `pos_next` is wrapped around in next cycle if there is more
incoming data, the `valid_next` is lowered.

Resolution:

    Now `prim_packer` considers `pos` value to assert `valid_o` prior to
    compare `pos_next`.

Problem 2:

    `ready_o` falsely asserted as `pos_next` wrapped around.

This issue is similar with the Problem 1. Problem 1 didn't cause any
functionally incorrect behavior. This problem causes an issue. As it let
the design latch the data even doesn't have sufficient storage inside.

Resolution:

    `ready_next` logic doesn't look `pos_next` but only looks at `pos`.
    If `pos` is less than `OutW`, it has enough internal storage to
    store incoming packet. Also, remind that if output port acked the
    outgoing data, it can always store incoming data.

This is related to #19
1 file changed
tree: 1ea7e4d519e1616f2230e8cb71b325a5daff8986
  1. .github/
  2. ci/
  3. doc/
  4. hw/
  5. site/
  6. sw/
  7. test/
  8. util/
  9. .clang-format
  10. .gitignore
  11. .style.yapf
  12. azure-pipelines.yml
  13. CONTRIBUTING.md
  14. index.md
  15. LICENSE
  16. meson.build
  17. meson_init.sh
  18. meson_options.txt
  19. python-requirements.txt
  20. README.md
  21. sitemap.md
  22. toolchain.txt
README.md

OpenTitan

This repository contains hardware, software and utilities written as part of the OpenTitan project. It is structured as monolithic repository, or “monorepo”, where all components live in one repository.

Documentation

The project contains comprehensive documentation of all IPs and tools. You can either access it online or build it locally by following the steps below.

  1. Ensure that you have the required Python modules installed (to be executed in the repository root):
$ sudo apt install python3 python3-pip
$ pip3 install --user -r python-requirements.txt
  1. Execute the build script:
$ ./util/build_docs.py --preview

This compiles the documentation into ./opentitan-docs and starts a local server, which allows you to access the documentation at http://127.0.0.1:5500.

How to contribute

Have a look at CONTRIBUTING.md for guidelines how to contribute code to this repository.

Licensing

Unless otherwise noted, everything in this repository is covered by the Apache License, Version 2.0 (see LICENSE for full text).