chisel icon indicating copy to clipboard operation
chisel copied to clipboard

Documentation for := vs <>

Open Shorla opened this issue 2 years ago • 70 comments

Contributor Checklist

  • [x] Did you add Scaladoc to every public function/method?
  • [x] Did you add at least one test demonstrating the PR?
  • [x] Did you delete any extraneous printlns/debugging code?
  • [x] Did you specify the type of improvement?
  • [x] Did you add appropriate documentation in docs/src?
  • [x] Did you state the API impact?
  • [x] Did you specify the code generation impact?
  • [x] Did you request a desired merge strategy?
  • [x] Did you add text to be included in the Release Notes for this change?

Type of Improvement

Documentation

API Impact

Add to the existing API No Impact

Backend Code Generation Impact

No Change

Desired Merge Strategy

Squash

Release Notes

Reviewer Checklist (only modified by reviewer)

  • [ ] Did you add the appropriate labels?
  • [ ] Did you mark the proper milestone (Bug fix: 3.3.x, [small] API extension: 3.4.x, API modification or big change: 3.5.0)?
  • [ ] Did you review?
  • [ ] Did you check whether all relevant Contributor checkboxes have been checked?
  • [ ] Did you mark as Please Merge?

Shorla avatar Oct 28 '21 18:10 Shorla

Since we're still working on this, I am going to move this to DRAFT until we've done some of the experiments.

This is a great first step, I think the next step would be to say, "What if we change this <> to a := ?" and show the resulting verilog. "What if we swap the order of the <> here?" and you can show the error message with scala mdoc:crash

As a heads up, my company is having a long weekend, so many of us will be less active online until next Tuesday.

mwachs5 avatar Oct 29 '21 03:10 mwachs5

@mwachs5 Thank you for your help. I will get right to setting up the environment

Shorla avatar Oct 29 '21 06:10 Shorla

Hi @mwachs5, I have been trying to get my environment working, I installed sbt, java but got stuck Installing and loading verilator since the commands keep bringing out error. so, I am wondering if Visual code can produce the verilog if the extensions are downloaded on it? if no, should I post the errors I got for you to take a look at it?

Shorla avatar Oct 31 '21 02:10 Shorla

You don’t need verilator to generate the verilog or the documentation. The command “sbt docs/mdoc” should work without it

mwachs5 avatar Oct 31 '21 04:10 mwachs5

Hi @mwachs5, I ran sbt docs/mdoc. here is the error I got.

[info] started sbt server sbt:chisel3> sbt docs/mdoc [error] Expected ID character [error] Not a valid command: sbt (similar: set, boot, last) [error] Expected 'sbtRebootNetwork' [error] Expected project ID [error] Expected configuration [error] Expected ':' [error] Expected key [error] Not a valid key: sbt (similar: test, state, ivySbt) [error] Expected 'sbtPromptChannel' [error] Expected 'sbtRebootImpl' [error] Expected 'sbtReportResult' [error] Expected 'sbtMapExec' [error] Expected 'sbtCompleteExec' [error] sbt docs/mdoc [error] ^ sbt:chisel3>

Shorla avatar Oct 31 '21 12:10 Shorla

Hi @mwachs5, I ran sbt docs/mdoc. here is the error I got.

[info] started sbt server sbt:chisel3> sbt docs/mdoc [error] Expected ID character [error] Not a valid command: sbt (similar: set, boot, last) [error] Expected 'sbtRebootNetwork' [error] Expected project ID [error] Expected configuration [error] Expected ':' [error] Expected key [error] Not a valid key: sbt (similar: test, state, ivySbt) [error] Expected 'sbtPromptChannel' [error] Expected 'sbtRebootImpl' [error] Expected 'sbtReportResult' [error] Expected 'sbtMapExec' [error] Expected 'sbtCompleteExec' [error] sbt docs/mdoc [error] ^ sbt:chisel3>

Hi @Shorla use docs/mdoc rather.

Burnleydev1 avatar Oct 31 '21 12:10 Burnleydev1

Or you run sbt docs/mdocs directly on the terminal and not the chisel shell.

Burnleydev1 avatar Oct 31 '21 12:10 Burnleydev1

@Burnleydev1 Thank you. I was able to figure that out and it ran successfully.

Shorla avatar Oct 31 '21 13:10 Shorla

I am still a bit confused though as to where the generated Verilog will appear. Is that on the terminal because it currently isn't or will I have to run something else?

Shorla avatar Oct 31 '21 13:10 Shorla

I think it's found in the folder generated which is under docs

Burnleydev1 avatar Oct 31 '21 14:10 Burnleydev1

cd docs/generated because when sbt docs/mdoc is run that folder is added so I think that is what is generated.

Burnleydev1 avatar Oct 31 '21 14:10 Burnleydev1

@Burnleydev1 can we do a quick zoom or google meeting for you to check out what I am doing?

Shorla avatar Oct 31 '21 14:10 Shorla

@Burnleydev1 can we do a quick zoom or google meeting for you to check out what I am doing?

Sure I would love to.

Burnleydev1 avatar Oct 31 '21 14:10 Burnleydev1

Okay, let me set up a link for you to join

Shorla avatar Oct 31 '21 14:10 Shorla

@Burnleydev1 https://us04web.zoom.us/j/71405809768?pwd=R1B1UG40SUxXVWlSdlE4T2d0ZkN4Zz09 The link

Shorla avatar Oct 31 '21 14:10 Shorla

@mwachs5 what next step will you recommend I take?

Shorla avatar Oct 31 '21 15:10 Shorla

Hi @Shorla , were you able to connect with @Burnleydev1 / get the docs build command to work?

I think the next step is to add the test cases:

a) what happens if you flip the direction of each of the "arrows" A, B, C (from the diagram), by swapping the left-hand-side and right-hand side? do you get an error, same verilog, or different verilog?

b) what happens if you replace the <> with a := on each of A, B, C? do you get an error, same verilog, or different verilog?

c) what happens if you add one or more val tmp = Wire(Decoupled(UInt8.W)) on each of A, B, C? For example from your Scastie, I added 2 tmp wires and got an error: https://scastie.scala-lang.org/GEusmAM5SXSnWM5pA1bpEg

mwachs5 avatar Oct 31 '21 22:10 mwachs5

@mwachs5 when we ran docs/mdoc, a new file "generated" was formed and it got successful feedback. Does that mean I am locally set to test the code?

I am to add test cases to my scastie, My result should be directly added to the document or first be discussed here?

Shorla avatar Oct 31 '21 23:10 Shorla

@mwachs5 Result from the test I carried out so far:

a) When all I did was flip the direction of each of the arrows, the Verilog remained the same, with no errors.

b) What happens if you replace the <> with a := on each of A, B, C? This error was produced for each of the arrows when <> was changed to this :=. Even when the RHS and LHS were flipped.

chisel3.internal.ChiselException: Connection between sink (DecoupledIO(IO in unelaborated Wrapper)) and source (DecoupledIO(IO io_a in PipelineStage)) failed @.bits: Sink is unwriteable by current module.
	at ... ()
	at Playground$Wrapper.<init>(main.scala:15)
	at Playground$$anonfun$13.apply(main.scala:31)
	at Playground$$anonfun$13.apply(main.scala:31)
	at ... ()
	at ... (Stack trace trimmed to user code only. Rerun with --full-stacktrace to see the full stack trace) 

c) In a bit to connect the wires, I wanted to cut down on the errors, so I connect tmp1 and tmp2 to DontCare temporarily, I used <> and got errors, it assumed DontCare is another thing to connect. But using := solved the problem.

The best I could get it error free after the wire connection. here is my scastie link: https://scastie.scala-lang.org/yWPCBE7wQPK9iZCvqsbFrg

Shorla avatar Nov 01 '21 13:11 Shorla

I am to add test cases to my scastie, My result should be directly added to the document or first be discussed here?

I think ultimately it would be nice to include the Scastie links in the document, though we haven't done that much in the documents before. But, I like the write up in your next comment, let me respond to that one.

mwachs5 avatar Nov 02 '21 04:11 mwachs5

a) When all I did was flip the direction of each of the arrows, the Verilog remained the same, with no errors.

Great, let's add that. Perhaps for each of these experiments we can add a heading with what the experiment shows. So your experiment a) shows that:

== Concept 1: <> is Communicative

// Put your code and description for for experiment a here

b) What happens if you replace the <> with a := on each of A, B, C? This error was produced for each of the arrows when <> was changed to this :=. Even when the RHS and LHS were flipped. ...

== Concept 2: := means assign ALL signals from the RHS to the LHS, regardless of their direction

??? maybe? This is frankly the thing I don't myself understand and the reason I opened this issue . I am not sure what := is supposed to mean for bi-directional signals.

In this section we can point out that following that, if you take := and try to use it to assign an input, you'll get the error that you showed.

c) In a bit to connect the wires, I wanted to cut down on the errors, so I connect tmp1 and tmp2 to DontCare temporarily, I used <> and got errors, it assumed DontCare is another thing to connect. But using := solved the problem.

Right, the := does work for DontCare for some reason I don't understand why it is different than the above case. So maybe we need:

== Concept 3: Always Use := to assign DontCare to Wires

If you have a Wire, the direction is "unknown" so we can't use DontCare on it. But we can use := as you found: https://scastie.scala-lang.org/8Ukzm4oBTA27UtVTR72aXA

== Concept 4: You can use <> or := to assign DontCare to directioned things (IOs)

I think this is basically equivalent, because in this base both <> and := will figure out the direction from the LHS...?

== Concept 4: Use <> for intermediate wire connections

The next concept is one of the reasons I wanted to write this article. This is an important error to show: https://scastie.scala-lang.org/AtDKcHFJSG6I4y3LstAP8A This is showing what I expect which is that you cant <> connect two wires, because CHisel can't figure out which way things flow. It works if there is only one wire in between, because the IO and the Child IO "fix" the direction: https://scastie.scala-lang.org/sV4Z95kOReSy6Hg2w5garQ

So perhaps this should be:

== Concept 5: <> only works between things with at least one known flow (An IO or child's IO). It will fail between two wires

The best I could get it error free after the wire connection. here is my scastie link: https://scastie.scala-lang.org/yWPCBE7wQPK9iZCvqsbFrg

Your above example is compiling, but there is actually no connection A anymore (there is no connection between tmp1 and tmp2.

mwachs5 avatar Nov 02 '21 04:11 mwachs5

@mwachs5 I am excited about this because I think I might have found an answer to your concept 2 question.

== Concept 2: := means assign ALL signals from the RHS to the LHS, regardless of their direction

??? maybe? This is frankly the thing I don't myself understand and the reason I opened this issue. I am not sure what := is supposed to mean for bi-directional signals.

Before adding DecoupledIO to the arrows, := was connecting them effortlessly. But as soon as we added DecoupledIO it wasn't able to. could it be because DecoupledIO contains a bulk connection that is bi-directional? The answer is yes. So, what if I split the components of Decoupled and connect them one after the other.... I did that it worked. https://scastie.scala-lang.org/Shorla/wS03QbmgT4eNqIMdhmw4Dw/6.

Shorla avatar Nov 02 '21 12:11 Shorla

Trying to connect ready in the same direction as others failed. but worked fine connecting it the other way. Here is what I think, since := can only assign signals from the RHS to the LHS and not vise-versa, it wouldn't connect bi-directional signals since there is one breaking its rule like Ready.

Shorla avatar Nov 02 '21 12:11 Shorla

what do you think?

Shorla avatar Nov 02 '21 12:11 Shorla

@mwachs5 on another note, we are due to submit our final application on Friday, November 5. Is there any particular order we are requested to fill that? How are we to go about the time line?

Shorla avatar Nov 02 '21 15:11 Shorla

@mwachs5 on another note, we are due to submit our final application on Friday, November 5. Is there any particular order we are requested to fill that? How are we to go about the time line?

I think you just have to fill it out by Nov 5. I think you can log any contributions that are still in flight as "in progress" if the PR is not merged yet, if that makes sense? In other words, something that is 75% of the way there is still a valuable contribution.

mwachs5 avatar Nov 02 '21 16:11 mwachs5

@mwachs5 thank you, I got that. But there is a time line for the internship period we need to fill and that is what I am not sure how to go about. Is there a guideline to doing that?

Shorla avatar Nov 02 '21 17:11 Shorla

@mwachs5 I am excited about this because I think I might have found an answer to your concept 2 question.

== Concept 2: := means assign ALL signals from the RHS to the LHS, regardless of their direction

??? maybe? This is frankly the thing I don't myself understand and the reason I opened this issue. I am not sure what := is supposed to mean for bi-directional signals.

Before adding DecoupledIO to the arrows, := was connecting them effortlessly. But as soon as we added DecoupledIO it wasn't able to. could it be because DecoupledIO contains a bulk connection that is bi-directional? The answer is yes. So, what if I split the components of Decoupled and connect them one after the other.... I did that it worked. https://scastie.scala-lang.org/Shorla/wS03QbmgT4eNqIMdhmw4Dw/6.

Did you take a look at this?

Shorla avatar Nov 02 '21 17:11 Shorla

@mwachs5 I have documented the results of the experiment.

Shorla avatar Nov 03 '21 01:11 Shorla

But there is a time line for the internship period we need to fill and that is what I am not sure how to go about. Is there a guideline to doing that?

Hi @Shorla, my understanding is that you need to a) log all your contributions and b) fill out the final application for any project you want to apply to. For example you can go to this link https://www.outreachy.org/outreachy-december-2021-internship-round/communities/chisel/create-verilog-vs-chisel-side-by-side-comparison-o/contributions/ to submit your final application assuming that is the project you want to apply for.

mwachs5 avatar Nov 03 '21 03:11 mwachs5