[libre-riscv-dev] Migen Conversions and Update

lkcl lkcl at libre-riscv.org
Wed Jan 2 06:51:25 GMT 2019


On Wed, Jan 2, 2019 at 5:14 AM Daniel Benusovich
<flyingmonkeys1996 at gmail.com> wrote:

> Good evening!

 eeevening

> I have been silent for while but not in vain!

 :)

> I have gotten a much better hold on Verilog, Python, and Migen in
> the past couple months.

 ahh, verycool.

> An arduous task indeed as I have never used Verilog before and very sparingly Python.

 it's fuuun.  really.  writing in one language to output another.

> Anyways I have done my best to port over Jacob's ALU first
> as a test run.

 niice.  got them.  style-wise: the character limit for pep8 is
line-length of 80.  this is *really* important (to me) as i pack
*eight* 80x65 xterms on one virtual window (the one with both firefox
and chrome on the RHS), and *TWELVE* 80x65 xterms on most other
virtual windows.

 this to get the absolute max number of edit sessions possible
on-screen, in order to see *all* related functions under
investigation.

>  I have attached the files (I know the mailing list wont have them but I will put in some choice snippets for the curious bits).
>
> I found that Migen does its best to keep things clean when converting from python to verilog and while some conversion are perfect the syntax can be a bit odd.

 yes.  ah btw, i discovered a couple of things since:

 (1) migen can't do unsigned shift left/right, only ASL / ASR (<<< and
>>>)... so we need to use nmigen

 (2) nmigen is a *LOT* cleaner.  it has a much clearer syntax "with"
for Case and or If statements, and its output uses yosys.

> For example, the ternary operation ( a ? b : c) is replicated via a function Mux(a, b, c) which I found quite odd as that is not mentioned anywhere. I only found out after converting it over in despair.

 :)  yeahh the problem is that everything has to be a python function:
there is no ternary operator in python, it's done syntactically:

 x = 5 if (y > 3) else 2

which is a pain in the ass.  for "standard" operations - add, mul,
compare etc - python has class-based functions __add__, __mul__,
__gt__, __ge__ etc. which will be called whenever the corresponding
python operator is used.

there just... doesn't happen to be an __ternary__ over-ride, which is
a significant oversight.


> The bigger problem is that I have not yet found a way to convert
> functions from python to verilog.

 ah.  yes.  the only "dividing" point is verilog modules.  if you use
yosys "show" on the verilog file, you'll find that's actually not a
problem.  the use of verilog functions i found to be a major blocker
to readability and understandability of the graphviz graph.

>  The functions are executed (in python) and the result is then converted into verilog.

 yes.  basically the functions create an Abstract Syntax Tree (AST),
in-memory.  that's recursively "walked" by a generator-function,
which... spits out verilog quite literally with simple "print"
statements.

 welcome to language translation! :)

 nmigen uses yosys to do that task.

>> Example.py
>> def add(a,b):
>>     return a + b
>>
>> //Various garbage here
>> ...
>> a.eq(add(0,1))
>> //More various garbage here
>> ...
>>
>> results in
>> Example.v
>> assign a = 1
>
>
> which was not my dream! Functionality is provided to get around it but it is not nearly as pretty.

 yosys output (from nmigen) is cleaner.

> This physically hurt me as Jacob's function was much prettier to look at (in Verilog).

 :)

> It seems to be hard without breaking into additional modules
> (which is fine but I wanted to keep it to the same file count).

 don't worry about it.

> In addition, i have not discovered a way to convert 'X' through
> as a default value (forgive my ignorance) if it is possible at all.

 i generally found that if the migen team left something out, there's
a damn good reason for it.

> A couple nice things after all the bad is no need to declare inputs or outputs!

 yeah i liked that.  it's only when you get to call it (as a verilog
module) that you need to declare the inputs and outputs of what you
are *calling*.

> It is all nicely handled which is a nice change of pace.

 ta-daaa :)

> After creating a module it can be easily referenced like any
> python object which is also very helpful as referencing internal
> signals and wires is a breeze.

 now you know why i am advocating it.  also, what's really *really*
cute: the python code can, at runtime, pass in *different* parameters,
which *CHANGES* the resultant AST, *WITHOUT* having stupid, stupid
#ifdef and other ridiculousness.

 also, you can pass in *groups* of wires - as class instances.  so all
the Hell of having verilog declarations that get larger and larger,
gathering more and more bus wires, until the top module has 700+
signal wires and is impossible to understand let alone debug... all
that's gone.



> I will continue to work on the conversion unless something else comes up.

 well.. i tell you what... have you heard of cocotb?

> Do let me know if anything needs to be done coding: the instructions,
> scoreboard, or implementation of Tomusulo's algorithm you are talking
> about in the mailing list and google discussion.

 there's been a lot over the past few weeks, this is the latest:
 https://groups.google.com/forum/#!topic/comp.arch/8pAGuX6UBu0

 i *really* like the CDC 6600, particularly the enhancements that
mitch alsup made.  i must send you his unpublished book chapters:
we're free to use them as long as we give mitch credit.


> If you could send me some references I would be happy to take a jab it.

 well, before we go ahead, we need to make a decision (you, me, jacob)
- as the project is being run on "unanimous" decision-making lines.
things to decide:

 (a) do we like migen enough to go with it?
 (b) do we use nmigen instead
 (c) are we going with 6600-style scoreboards?

> Happy new year!

 you too :)



More information about the libre-riscv-dev mailing list