What’s due

  1. HDL: As with prior assignments, your completed HDL needs to be submitted (via GitHub) to Gradescope. A significant portion of the grade comes from passing unit tests.
  2. Questions: The GitHub submission needs to include completed answer to the questions in questions.md in the repo.
  3. Demo: An in-person demo is required for part of the grade. The demo needs to be completed during office hours within 10 days after the assignment is officially due. Demos can not be done until the official due date, but must be completed by Oct. 22nd. Late penalties are based on the Gradescope submission, not the completion of the demo.

Demos!

Most remaining assignments will require an in-person demonstration (and answering some questions) within 10 days of the due date to get full credit. Demos must be done during office hours. Review the office hour schedule for sessions that may work well with your schedule.

Setup

Create a Repo

  1. Navigate to link
  2. If shown a list of IDs, select your WUSTL Key from the list (this only needs to be done once. If you already did this during studio, you won’t be given the optiona gain)
    Select ID
  3. “Accept the assignment”.
    Accept
  4. Follow the link to the new repository for the group:
    Repo

Codespaces

  1. We’ll be using Codespaces for many studios and assignments.
  2. Create a code space from the repository:
    Create Codespace

Beware!

The Codespace typically takes about 2-4 minutes to set up. If you stop working for more than a minute, please explicitly stop the Codespace (see the bottom of this assignment). You can restart the codespace by simply going to https://github.com/codespaces and clicking on the name of the Codespace for the repository. (The page will have a list of codespaces, the number of Cores and RAM for each, etc.)

Alternatives to Codespaces

There are two alternatives to the web-based Codespace:

  1. Use a local installation of VS Code to connect to the Codespace. See: Local VS Code Connection to Codespace.
  2. Run everything entirely locally, which will allow you to work without an internet connection and may be faster, but it may require more than a gigabyte of space. See: Running Entirely Locally

Problem 1: Your assignment: Simple Combinational Logic

  1. Run the 1.1 simple_comb testbench verification task (Click the VSCode Tasks icon on the side bar (VSCode Tasks) and then the task’s name). Observe that the PROBLEMS tab shows that several test cases failed:

    Comb Logic Failed

  2. The “Surfer” pane will allow you to explore signals that were being used in the text. Expand the simple_comb_tb (this is the test bench), then the dut (the “device under test”), then select variables a, b, and c:

    Expanding to see ABC

  3. Notice the picture above only shows the initial values of a, b, and c, but you should be able to see the full signal (zoom in/out or scroll). If you click the mouse along the signal it will show you the values of each at exaclty that instant. Or if you click and drag you can see how they change as time changes. Review them from the beginning (t=0) to the end (t=170).

  4. Run the 0.0 Edit questions.md task and answer question 1 in the designated place (don’t remove the # Q lines!, but remove/replace the TODO lines. You can answer with plain text, although you are also welcome to use MarkDown notation for styling if you’d like).

  5. Run the 1.2 Edit simple_comb.sv task. Review the desciption of what’s expected and fix the designated line using basic Verilog operations (behavioral Verilog with symbols for the operations, like & for AND).

  6. Re-run 1.1 simple_comb testbench verification and confirm that all tests pass in the PROBLEMS pane. (Or, if not, continue to edit simple_comb.sv).

  7. Once it correctly passes the test bench, run ask 1.3 Simulate simple_comb.sv, which will allow you to simulate the circuit. Be sure to hit the “play” button in the DIGITALJS: CONTROL pane to simulate the circuit.

  8. Set c to a 1 and both a and b to 0.

  9. Complete Q2 in questions.md.

  10. The “synthesis” takes our HDL description and breaks it down into simpler parts which can be run on real hardware. Run task 1.4 AIG Mapping. Complete Q3 and Q4 in questions.md.

Problem 2: Verilog Structure

Consider the circuit:

p1

  1. Use task 2.1 Edit structural.sv and complete the HDL description using structural modeling!

    Primitive gates can be modeled with the format: type(output, inputs...). For example, a 3-input or gate could be modeled with or(output, a, b, c); or with a unique name for the instance of the or gate, like or gate1(out, a, b, c);.

    Beware!

    For most of the semester we will use SystemVerilog’s logic type, which can represent either a connection between elements or a value stored (latched or in a flip-flop). There are cases, including here, where a wire type needs to be used to represent a true wire.

    The simulator for the test bench is very strict about this and will require the output of primitive, structural gates be an appropriate type, like wire.

    The simple simulator is much less rigid. It makes some assumptions about default behavior and will simulate things that are not defined precisely enough for the simulator.

    The difference in behavior between different tools is partly a result of their different intended uses and partly a result of how rigidly they enforce standards.

    Caution!

    The problem asks for a structural model. You should not use always_comb statements. assign should only be used for the final, simple assignments of outputs (of the format assign output = internal. They should not use more complex expressions.) You should use the primitive parts and(...), or(...), not(...), etc. Although you may pass test cases with other forms of modeling, credit will only be given for a structural model.

  2. Use the 2.2 Simulate structural.sv task and the 2.5 structural testbench tasks to test your work. Revise your work until you pass the testbench (but, again, be sure you are using ONLY structural elements. No use of operators like ~, ^, &, etc.)

  3. Run task 2.4 (AIG Mapping) and 2.5 (iCE40 Mapping) and answer Q5 in questions.md.

Problem 3: Basic addition - Revisiting Hw 2a

Consider adding 2-digit binary numbers, $a$ and $b$ to produce the 2-bit result, $s$ and a one-bit carry-out, $c$:

a 1 a 0 + b 1 b 0 c s 1 s 0

Caution!

Note that a, b, and s are each two-bit binary values (rather than each being made of two, distinct, binary inputs). Moreover, you should assume that values are “most significant bit first” unless otherwise specified.

  1. Use task 3.1 to edit add2.sv. Complete it as described. Use tasks 3.2 and 3.3 to test your work. Update it until you pass all tests.
    • Task 3.2 Simulate add2.sv will allow you to simulate the adder. The inputs and outputs are no longer simple, binary value. Hovering over an input or output will allow you to use the base being used to enter or show that value:

    Input Box and Base

    Caution!

    You must update values and then click out of the input box for the simulator to use the updated value. (If the cursor is still in the box, it isn’t clear that you are done typing a new value)

  2. Use the 3.5 add2 iCE40 bitstream to create a bit stream and Program your Device.
    • The left four buttons can be used to increase or decrease the values used for a and b, which are displayed in the designaed aresa.
    • s, the sum, will be shown on the rightmost digit.
    • c, the carry out, will be shown on the decimal point of the second digit from the right.

Board For Adder

  1. Complete Q7-Q10 in questions.md

End of work

Caution!

Be sure to “stop” your Codespace. You have approximately 60 hours of Codespace time per month. Codespaces often run for ~15 minutes extra if tabs are just closed.

Codespace


Submission

The assignment will be submitted via GitHub and Gradescope.

1. First, be sure to commit and push files to GitHub (as shown in studio).

Caution!

Be sure all files are included, including completed questions.md, which is 30% of the grade!!!

1.1

Source Selection

1.2

Commit Message

1.3

Commit and Push

2. Then go to GitHub.com and confirm the updates are on GitHub

3. Finally (after confirming updates are on GitHub), go to the assignment in Gradescope and import it from GitHub:

3.1

Repo Selection

3.2

Branch Selection