WEBVTT

00:00.000 --> 00:09.000
All right, my name is Mohammed Galu.

00:09.000 --> 00:13.000
I'm a embedded software consultant out in New York City.

00:13.000 --> 00:17.000
My company's map lab embedded solutions, and this is my talk.

00:17.000 --> 00:22.000
Essentially, you kind of follow up to last your stock and we'll go over what that means in a little bit.

00:22.000 --> 00:23.000
So this is just about me.

00:23.000 --> 00:27.000
Like I said, I'm an embedded software consultant in New York City in America.

00:27.000 --> 00:32.000
Mostly due design work focused on medical devices, scientific instruments,

00:32.000 --> 00:37.000
a light art project that I've been working on recently that involves FPGAs,

00:37.000 --> 00:42.000
and also this past year worked on writing embedded software

00:42.000 --> 00:47.000
implementing Zephyr on a custom ASIC that also had a risk, five core on it.

00:47.000 --> 00:53.000
So obviously my experience in expertise is in Zephyr embedded Linux,

00:53.000 --> 00:57.000
and also some gooey-based applications that are based on cute.

00:57.000 --> 00:59.000
You can sign up for my newsletter.

00:59.000 --> 01:02.000
I host a number of webinars and workshops throughout the year.

01:02.000 --> 01:07.000
This year, going to go into some more training events surrounding embedded Linux,

01:07.000 --> 01:10.000
Yaco, and Zephyr.

01:10.000 --> 01:14.000
So this is a quick rundown of the agenda for today.

01:14.000 --> 01:17.000
We're going to just go over some background.

01:17.000 --> 01:21.000
We're going to briefly go under the hood.

01:21.000 --> 01:26.000
And part of I just want to set the stage for this talk,

01:26.000 --> 01:30.000
because of my vicinity to FPGA engineers,

01:30.000 --> 01:32.000
like I pretend to be an FPGA engineer.

01:32.000 --> 01:34.000
So I like to do things that are with it,

01:34.000 --> 01:36.000
that are at the nexus of FPGA development,

01:36.000 --> 01:38.000
and embedded software engineers,

01:38.000 --> 01:43.000
but embedded software, but what you'll see is that eventually I stumble,

01:43.000 --> 01:44.000
and I need help.

01:44.000 --> 01:47.000
And so part of the motivation behind this talk is to reach out

01:47.000 --> 01:50.000
to hopefully the right community and get help,

01:50.000 --> 01:53.000
and we'll see where that goes.

01:53.000 --> 01:58.000
So under the hood, the plan, what I had envisioned when working on this project,

01:58.000 --> 02:02.000
how it went, it didn't go well, and what are the next steps, right?

02:02.000 --> 02:05.000
So understanding how to debug, like basically,

02:05.000 --> 02:07.000
teaching an embedded software engineer,

02:07.000 --> 02:12.000
like how do you debug FPGA code using open source tools?

02:12.000 --> 02:14.000
So like I said, some background last year,

02:14.000 --> 02:16.000
I gave the precursor to this talk.

02:16.000 --> 02:20.000
Which was essentially using an open source risk five,

02:20.000 --> 02:24.000
32 implementation on an FPGA.

02:24.000 --> 02:32.000
It was based on a really lattice ice 25 PK, like FPGA.

02:32.000 --> 02:34.000
Really inexpensive, so you know,

02:34.000 --> 02:37.000
didn't have to spend too much money getting the board.

02:37.000 --> 02:43.000
I was able to load hello world from Zeffer onto the FPGA,

02:44.000 --> 02:47.000
and you know, the exciting thing was it worked

02:47.000 --> 02:49.000
to a certain degree out of the box.

02:49.000 --> 02:52.000
I used not open source tools.

02:52.000 --> 02:54.000
I used the vendor like lattice tools,

02:54.000 --> 02:57.000
which you know, was fine for the moment.

02:57.000 --> 03:00.000
It was fine for the time.

03:00.000 --> 03:04.000
So the obvious next step,

03:04.000 --> 03:06.000
if you look at last year's presentation,

03:06.000 --> 03:09.000
was I wanted to kind of investigate the CFU,

03:09.000 --> 03:12.000
because the cool thing about the new RV 32 project

03:12.000 --> 03:15.000
is that it has the function.

03:15.000 --> 03:18.000
It's easy for me as not an FPGA engineer

03:18.000 --> 03:20.000
to enable CFU support,

03:20.000 --> 03:23.000
and they have software examples on how to actually exercise it.

03:23.000 --> 03:27.000
They have their example code actually demonstrates

03:27.000 --> 03:30.000
the performance metrics that has a small function

03:30.000 --> 03:34.000
that you can execute to understand what the performance

03:34.000 --> 03:37.000
difference is between a simple kind of custom function

03:37.000 --> 03:39.000
and implementation in hardware,

03:39.000 --> 03:42.000
versus the equivalent implementation in software.

03:42.000 --> 03:45.000
But when I tried to do that,

03:45.000 --> 03:46.000
so here on this thing,

03:46.000 --> 03:49.000
it's basically the summary of the screenshot

03:49.000 --> 03:52.000
that you have is essentially what was the culmination

03:52.000 --> 03:53.000
of last year's presentation.

03:53.000 --> 03:56.000
We get hello world running on new RV 32.

03:56.000 --> 04:00.000
But the problem was when I tried to enable CFU last year,

04:00.000 --> 04:02.000
it didn't fit on the FPGA.

04:02.000 --> 04:04.000
The lattice tools basically complete,

04:04.000 --> 04:07.000
that oh, your FPGA doesn't have enough resources

04:07.000 --> 04:10.000
to be able to support the design that enables CFU.

04:10.000 --> 04:13.000
So that was the motivation behind this,

04:13.000 --> 04:15.000
this talk in this project.

04:15.000 --> 04:17.000
So just some precursor,

04:17.000 --> 04:20.000
again, maybe 90% of you are like,

04:20.000 --> 04:22.000
you know, why are you talking about this?

04:22.000 --> 04:23.000
This is, you know, we already know this,

04:23.000 --> 04:25.000
but you know, for the 10% like me,

04:25.000 --> 04:27.000
it's useful to understand some of these

04:27.000 --> 04:29.000
some of this background material.

04:29.000 --> 04:33.000
So what is the custom function unit in risk five?

04:33.000 --> 04:36.000
Essentially it allows us to offload functionality

04:36.000 --> 04:40.000
to hardware that you can implement outside of the extension

04:40.000 --> 04:42.000
outside of the risk five.

04:42.000 --> 04:46.000
I say, right, that's your own custom implementation,

04:46.000 --> 04:48.000
but there's infrastructure surrounding it

04:48.000 --> 04:52.000
to allow essentially software to talk to the hardware

04:52.000 --> 04:55.000
to be able to execute certain functions in hardware

04:55.000 --> 04:58.000
and you can retrieve those results.

04:59.000 --> 05:03.000
There are useful for operations that are not,

05:03.000 --> 05:06.000
that it's not optimal to implement in hardware.

05:06.000 --> 05:08.000
So if you're concerned about performance,

05:08.000 --> 05:10.000
if you're concerned about latency,

05:10.000 --> 05:12.000
energy consumption and program memory,

05:12.000 --> 05:14.000
it may be useful to investigate

05:14.000 --> 05:17.000
your implementation of your function in hardware

05:17.000 --> 05:19.000
and then leverage the CFU extension

05:19.000 --> 05:23.000
to be able to allow software to call into hardware

05:23.000 --> 05:27.000
to implement to actually exercise that function that you want.

05:27.000 --> 05:31.000
So some examples of why you would want to use

05:31.000 --> 05:33.000
as CFU AI, right?

05:33.000 --> 05:35.000
So now we're seeing a lot of days.

05:35.000 --> 05:38.000
There's a lot of advancements that are enhancement

05:38.000 --> 05:40.000
that you can make in terms of your implementation in hardware

05:40.000 --> 05:42.000
that are relevant to AI.

05:42.000 --> 05:46.000
So you may be beneficial to leverage the CFU extension

05:46.000 --> 05:49.000
to implement some of these function calls

05:49.000 --> 05:52.000
or in hardware and then essentially leverage that extension

05:52.000 --> 05:55.000
to make that call in from the software side.

05:55.000 --> 05:59.000
Crypto obviously communications arithmetic and image processing.

05:59.000 --> 06:03.000
So one of the restrictions that I learned about the CFU is

06:03.000 --> 06:05.000
that it requires CPU dependency.

06:05.000 --> 06:08.000
So it's not something that you can just tell the hardware

06:08.000 --> 06:11.000
okay go and the CPU kind of comes back and says,

06:11.000 --> 06:12.000
okay, fetch me the result.

06:12.000 --> 06:15.000
It's something that the CPU needs to be involved

06:15.000 --> 06:18.000
in terms of producing that result.

06:18.000 --> 06:22.000
So the CFU from mind your standing is that it requires

06:22.000 --> 06:27.000
the CPU to be a part of the operation when you're doing it.

06:27.000 --> 06:34.000
So the CFU actually leverages these custom kind of

06:34.000 --> 06:37.000
op codes in the ISA.

06:37.000 --> 06:42.000
So like I said, the CFU is a specific implementation

06:42.000 --> 06:44.000
of an extension of the ISA.

06:44.000 --> 06:49.000
So that's the CFU extension and that is specific.

06:49.000 --> 06:54.000
This particular extension is specific to the NIORV32 implementation.

06:54.000 --> 06:58.000
And the cool thing like I said is they have a sample implementation

06:58.000 --> 07:02.000
of a block cipher called XDA in the RTL, right,

07:02.000 --> 07:06.000
which is a really simple implementation

07:06.000 --> 07:09.000
or of that's useful for embedded systems.

07:09.000 --> 07:14.000
And so like right here you can see the bottom table

07:14.000 --> 07:17.000
essentially shows how the op codes are mapped

07:17.000 --> 07:21.000
and that you can leverage those to give you a particular kind of

07:21.000 --> 07:23.000
CFU implementation.

07:23.000 --> 07:29.000
So this is basically kind of showing again the mapping

07:29.000 --> 07:33.000
between the actual RTL in the NIORV implementation

07:33.000 --> 07:36.000
and then from the software side how their demo code kind of

07:36.000 --> 07:37.000
implements.

07:37.000 --> 07:41.000
So essentially what they're doing is they're using the

07:41.000 --> 07:45.000
extrinsic inside the compiler to call functions

07:45.000 --> 07:46.000
in the CFU, right.

07:46.000 --> 07:51.000
So essentially they have a particular set of op codes

07:51.000 --> 07:56.000
that are extended using the CFU extension and then in

07:56.000 --> 07:59.000
the software they essentially have these extrinsic

07:59.000 --> 08:03.000
that are defined that essentially just call the the

08:03.000 --> 08:07.000
compiler to basically implement a particular op code and then

08:07.000 --> 08:10.000
the compiler essentially sets up the appropriate

08:10.000 --> 08:13.000
instructions to make calls into the RTL.

08:14.000 --> 08:17.000
And then here's you can see essentially like more

08:17.000 --> 08:20.000
more macros that essentially convert

08:20.000 --> 08:23.000
calling into this CFU particular instruction.

08:23.000 --> 08:28.000
And then we can see here like if you map what's on the

08:28.000 --> 08:32.000
the last set of bits in the bottom macro they map

08:32.000 --> 08:36.000
essentially to like the op codes for a particular kind of CFU

08:36.000 --> 08:39.000
in the table down here.

08:39.000 --> 08:42.000
And then if you write if you actually again like

08:42.000 --> 08:46.000
just just go into macros again you can see that this is

08:46.000 --> 08:50.000
finally the assembler call that actually makes that that

08:50.000 --> 08:54.000
is invoked by essentially setting the appropriate

08:54.000 --> 08:58.000
op codes and then making the calls into the RTL essentially

08:58.000 --> 09:01.000
and then the compiler basically handles the magic of

09:01.000 --> 09:04.000
you know making the calls into the RTL for the

09:04.000 --> 09:07.000
particular implementation that you want.

09:07.000 --> 09:11.000
So just just kind of like an overview of the background

09:11.000 --> 09:16.000
on you know what what the CFU means understanding how

09:16.000 --> 09:19.000
the software essentially ties into the hardware and how

09:19.000 --> 09:21.000
we can kind of leverage those calls.

09:21.000 --> 09:22.000
So now the plan right.

09:22.000 --> 09:26.000
So last time when we try to run the design with the CFU

09:26.000 --> 09:29.000
enabled the tools complain that okay you know your your

09:29.000 --> 09:32.000
FPJ doesn't support doesn't have enough room to

09:32.000 --> 09:34.000
essentially support the functionality or support your

09:34.000 --> 09:35.000
design.

09:35.000 --> 09:38.000
So step one is get an FPJ that does fit this design.

09:38.000 --> 09:43.000
Enable to see a few in the top level board file in the

09:43.000 --> 09:44.000
RTL.

09:44.000 --> 09:46.000
Build in flash design.

09:46.000 --> 09:48.000
You know let's start simple let's just load

09:48.000 --> 09:50.000
Zefer, Blinky or hello world.

09:50.000 --> 09:52.000
Make sure that's working.

09:52.000 --> 09:54.000
And then okay now we need to add what the

09:54.000 --> 09:57.000
macros that you saw in their demo example we need to add

09:57.000 --> 10:01.000
those into Zefer compile those in our demo example

10:01.000 --> 10:04.000
that runs essentially the same XCA blocks

10:05.000 --> 10:08.000
I for and then do the same comparison in the reference

10:08.000 --> 10:11.000
design that they have in their software repo.

10:11.000 --> 10:14.000
And you see if we can do the same thing on Zefer right.

10:14.000 --> 10:16.000
And and essentially like we have a reference

10:16.000 --> 10:20.000
implementation of the non Zefer application right

10:20.000 --> 10:23.000
and we have a reference and we have an implementation of

10:23.000 --> 10:26.000
the Zefer XDA just confirmed that actually the

10:26.000 --> 10:29.000
operations in terms of performance they actually match

10:29.000 --> 10:30.000
the reference design.

10:30.000 --> 10:33.000
Right and so for the first step right this is the the

10:33.000 --> 10:36.000
report that I just decided to use because it was

10:36.000 --> 10:38.000
reference in their repository.

10:38.000 --> 10:40.000
It's an orange crab FPGA.

10:40.000 --> 10:42.000
It's also relatively cheap.

10:42.000 --> 10:45.000
I think it costs like $30 or so.

10:45.000 --> 10:48.000
And you know it was just small.

10:48.000 --> 10:54.000
The problem was that the orange crab that exist today

10:54.000 --> 10:56.000
is actually a much bigger.

10:56.000 --> 10:58.000
It's both good in that right it's good because it's a

10:58.000 --> 11:01.000
bigger FPGA than the board I was using last year.

11:01.000 --> 11:05.000
So I was expecting that would support CFU support.

11:05.000 --> 11:06.000
The CFU extension.

11:06.000 --> 11:08.000
So that shouldn't be a problem.

11:08.000 --> 11:11.000
The problem is again like there's as we're going to see

11:11.000 --> 11:15.000
there's a lot of infrastructure when you're using FPGA tools

11:15.000 --> 11:18.000
that are open source that you need to set up to make sure

11:18.000 --> 11:20.000
that it actually builds for the right thing.

11:20.000 --> 11:23.000
So so it boots right.

11:23.000 --> 11:26.000
And yeah so like I said like the current orange crab

11:26.000 --> 11:29.000
implementation the setup that they're using uses the

11:29.000 --> 11:31.000
smaller FPGA.

11:31.000 --> 11:37.000
So it wasn't going to work obviously in the board that I purchased.

11:37.000 --> 11:41.000
So the first step forget forget even just you know building the

11:41.000 --> 11:47.000
RTL loading it onto the FPGA and just seeing if it works.

11:47.000 --> 11:51.000
I couldn't even just get the tools to install correctly right.

11:51.000 --> 11:54.000
So what I did was you know again software engineer.

11:54.000 --> 11:57.000
Okay let me just see the tools that they're using and just install

11:57.000 --> 11:59.000
it on my local machine.

11:59.000 --> 12:01.000
Nope that one just terribly wrong all sorts of ours.

12:01.000 --> 12:03.000
No idea what's going on.

12:03.000 --> 12:05.000
So I took an easier route.

12:05.000 --> 12:07.000
I said well they have to build the somehow right.

12:07.000 --> 12:10.000
So let me see what they did and just copy whatever they're doing.

12:10.000 --> 12:15.000
So I noticed that in their GitHub actions their workflow.

12:15.000 --> 12:18.000
They're essentially just using a container that they pulled from

12:18.000 --> 12:21.000
somewhere that has a necessary tools has a necessary set up.

12:21.000 --> 12:23.000
So I did the same thing right.

12:23.000 --> 12:26.000
So I just copy to essentially their container their doctor file.

12:26.000 --> 12:29.000
And I stripped it down to essentially whatever I need it.

12:29.000 --> 12:34.000
And you know just essentially ran that as a container on my PC.

12:34.000 --> 12:39.000
So this was exactly the doctor file that I have that I use on my machine

12:39.000 --> 12:40.000
to build these things.

12:40.000 --> 12:44.000
And then on the bottom here you can essentially see the container

12:44.000 --> 12:48.000
and vacation that I have which essentially just runs make

12:48.000 --> 12:53.000
specific to this particular board and then runs a target that essentially just

12:53.000 --> 12:55.000
creates an image which is a bootloader.

12:55.000 --> 12:58.000
Which is the only thing I care about.

12:58.000 --> 13:03.000
So once I had the tools running right did a basic compilation of the

13:03.000 --> 13:04.000
actual design.

13:04.000 --> 13:08.000
So like okay the next step is to actually enable CFU support.

13:08.000 --> 13:09.000
So that was simple enough.

13:09.000 --> 13:13.000
I just looked at the top level design file.

13:13.000 --> 13:16.000
And I just set the flag for CFU to true.

13:16.000 --> 13:18.000
So simple enough.

13:18.000 --> 13:22.000
The other problem is again.

13:22.000 --> 13:26.000
Because the existing design assumes that the orange crab board

13:26.000 --> 13:29.000
supports up the older smaller FPGA.

13:29.000 --> 13:33.000
I needed to modify it to be able to support the newer one right.

13:33.000 --> 13:35.000
And so I learned this the hard way.

13:35.000 --> 13:37.000
I essentially didn't know about this.

13:37.000 --> 13:40.000
I just built it and built fine flashed it like nothing happened right.

13:40.000 --> 13:41.000
I didn't get any bootloader.

13:41.000 --> 13:42.000
I didn't get anything.

13:42.000 --> 13:44.000
Look on the forums they're like yeah.

13:44.000 --> 13:51.000
Yeah because you didn't actually tell the tools to build for an 85 series FPGA.

13:51.000 --> 13:54.000
You still told it to build for 25 series FPGA.

13:54.000 --> 13:59.000
So okay the easiest thing for me to do after kind of digging around the

13:59.000 --> 14:01.000
help files for the tools that I was using.

14:01.000 --> 14:06.000
Let me just replace this 25 with the 85 and then see how it goes.

14:06.000 --> 14:11.000
Ideally the orange crab like initially what I did you know the proper way

14:11.000 --> 14:12.000
of doing things was okay.

14:12.000 --> 14:18.000
Let me just change this variable that they're using in their make files to an 85F instead of

14:18.000 --> 14:20.000
using 25F.

14:20.000 --> 14:22.000
That just was disastrous like that didn't work.

14:22.000 --> 14:26.000
It's all because all sorts of issues so I said okay let me just try the easy way out

14:26.000 --> 14:32.000
and just I know this flag is used for the FP that's used to the that's specified

14:32.000 --> 14:36.000
to the FPGA tools to indicate which FPGA they want to use.

14:36.000 --> 14:40.000
So I'll just change that for now and then leave all the rest for later.

14:41.000 --> 14:46.000
So after I did all those changes got my container running with the tools.

14:46.000 --> 14:51.000
Made the changes of the make files to use the larger FPGA and able CFU support

14:51.000 --> 14:54.000
successfully built the FPGA.

14:54.000 --> 15:01.000
They used the suggest using the FPGA to flash the FPGA essentially just hold down the power button

15:01.000 --> 15:05.000
while you're plugging it in and it's just going to enter program mode.

15:05.000 --> 15:14.000
And I needed to do some do some mechanics with DFU to basically attach the FPGA information

15:14.000 --> 15:19.000
or the hardware information to this DFU file and then once that was up and running

15:19.000 --> 15:23.000
I was able to just get bootloader output from the UR.

15:23.000 --> 15:30.000
So so that's great right at least I confirm that I can get something running on my FPGA

15:30.000 --> 15:33.000
that is based on risk five.

15:33.000 --> 15:36.000
It kind of you know at least something is working right.

15:36.000 --> 15:40.000
So the next step was okay let me just take the upstream Zephyr repo,

15:40.000 --> 15:45.000
latest LTS for.0 and see what happened later certainly it's not LTS.

15:45.000 --> 15:53.000
So built it, create, try to you know just load the application using the bootloader.

15:53.000 --> 15:58.000
They have a script that allows you to like just essentially do the same thing

15:58.000 --> 16:01.000
more scripted in a more scripted way.

16:01.000 --> 16:06.000
The problem ended up being that when I tried to actually upload it the bootloader complaint right

16:06.000 --> 16:08.000
through this error.

16:08.000 --> 16:13.000
Instead of reading the source code for the bootloader their documentation for the repository is really great.

16:13.000 --> 16:18.000
So it's essentially said that the application image you're trying to flash is too large.

16:18.000 --> 16:23.000
So you know you need to essentially increase the particular parameter in your RTL

16:23.000 --> 16:26.000
and then that should work hopefully.

16:26.000 --> 16:33.000
Based on their recommendation I increase this instruction memory size from 16k to 32k.

16:33.000 --> 16:35.000
Recompiled the design again.

16:35.000 --> 16:41.000
This time the bootloader didn't complain but I still wasn't getting any hello world right.

16:41.000 --> 16:46.000
No blanky, no hello world from the basic kind of Zephyr build.

16:46.000 --> 16:49.000
And so I said okay let me take a step back.

16:49.000 --> 16:54.000
Let me see whether it's a problem with maybe it's a Zephyr problem right.

16:54.000 --> 16:55.000
Let me just go back.

16:55.000 --> 17:01.000
Let me go to the reference implementation on the software side and see like okay if I can I just load a blanky example.

17:01.000 --> 17:05.000
I tried to write building it still same issue.

17:05.000 --> 17:09.000
I couldn't get their application to run one loading through the bootloader.

17:09.000 --> 17:12.000
There's no indication of any error.

17:12.000 --> 17:13.000
The bootloader just is there.

17:13.000 --> 17:17.000
So it seems to me that the bootloader is actually jumping to the application.

17:17.000 --> 17:23.000
But when it goes to when the application goes to load there's clearly something wrong.

17:23.000 --> 17:30.000
So the question is right and you know this is hopefully this is why I'm here right asking for help.

17:30.000 --> 17:33.000
So I need to understand like what tools.

17:33.000 --> 17:41.000
What resources that I can use to understand like okay once I'm in the bootloader you know like what's going on right.

17:41.000 --> 17:44.000
So clearly something is working in the design right I can get you right output.

17:44.000 --> 17:52.000
The bootloader is actually doing something right it's actually receiving the image and it's saying okay right you know the image looks good.

17:52.000 --> 17:58.000
But then when I try to execute that image right that's where the bootloader is complaining so the question is is it.

17:58.000 --> 18:04.000
Is it an FPGA problem or is it still a software problem right do I need to debug the bootloader to understand.

18:04.000 --> 18:15.000
What the problem is or do I need to debug the FPGA size to understand what problem is now one thought that did occur to me today was that one of the features of.

18:15.000 --> 18:27.000
This implementation is that you can actually generate VHDL of the application that you're trying to build and actually embed it into your actual design so that you know if that works.

18:27.000 --> 18:33.000
So I don't know like if that's a better way to debug something or a worse way does that would that tell me anything.

18:33.000 --> 18:43.000
But you know again you know from from an embedded software perspective point of view like what are the types of tools that I can use to and it's not just.

18:43.000 --> 18:54.000
The tools right so in this in this project I used like truly open source tools because again the the platform that they supported was like you know somebody had used open source tools.

18:54.000 --> 18:58.000
To be able to like build a design and and load them.

18:58.000 --> 19:10.000
But what can I do in terms of debugging right so you know as an embedded software engineer I know J tag I know SWD I know GDB I know how can I know what you do in those cases right how to debug software.

19:10.000 --> 19:21.000
But what are the equivalent tools that I can use from an FPGA point of view right I've done the Ziling's ILA and I've used an opposite identifying micrachip.

19:21.000 --> 19:29.000
Platform so what are the equivalent of of open source tools right like what software tools do I need what hardware tools do I need.

19:29.000 --> 19:34.000
To be able to kind of perform these troubleshooting steps so.

19:35.000 --> 19:37.000
So what are the next steps right so.

19:37.000 --> 19:41.000
Obviously right the first step is just to get the application to load.

19:41.000 --> 19:47.000
And then just do what I'd originally planned out to do right get these comparison metrics and zephyr.

19:47.000 --> 19:51.000
Hopefully you know if it's successful I can present it next year.

19:51.000 --> 20:02.000
And then again integrate the see a few this is the whole plan of this into zephyr right add those necessary calls and try to upstream the libraries or the modifications that I make disaster.

20:02.000 --> 20:09.000
I try to get it in zephyr as part of the architecture implementation and then the next thing that I want to investigate is.

20:09.000 --> 20:22.000
What I a new feature that I learned of the risk five is is and it's it's an extension or enhancement of CFU which is a custom function subsystem and it allows from for my understanding it allows essentially.

20:22.000 --> 20:30.000
The hardware to and perform operations that are completely independent of the CPU and that doesn't need any CPU dependencies.

20:30.000 --> 20:37.000
So hopefully those are the next steps and hopefully you know somebody out there can help me figure out what I did wrong so far.

20:37.000 --> 20:39.000
Yep, so thank you.

20:39.000 --> 20:48.000
All right, well time for questions.

20:48.000 --> 20:59.000
Any questions?

20:59.000 --> 21:13.000
Yeah, so what I understand is that you enable something first in digital design right and everything rest of the software let's say was same and now it's not booting in application right.

21:13.000 --> 21:24.000
So first thing would be if you change anything in digital design right you would have to run it against some basic verification right with very later or something.

21:24.000 --> 21:29.000
That's some messages in the system where you log in see what happens.

21:29.000 --> 21:31.000
That's the basic thing.

21:31.000 --> 21:41.000
Again, and if you come on the software side then so you have let's say directly accessing physical memory right to load the loads.

21:41.000 --> 21:51.000
So there are other software also right not just the boot loader that you can run on a physical application and try to access that but for the address that you have added in the digital design.

21:51.000 --> 21:54.000
There are things like mayor box or something else.

21:54.000 --> 21:59.000
By saying that you can use to access that but the thing that you have added in the design.

21:59.000 --> 22:01.000
Are you able to access it or are you pretty.

22:01.000 --> 22:08.000
So you're saying even instead of the boot loader or remove the boot loader what does boot loader do is that it writes some.

22:08.000 --> 22:12.000
This is some basic physical address.

22:12.000 --> 22:15.000
You can do it yourself jump there and try to do yourself.

22:15.000 --> 22:19.000
I see right not don't try to jump to application land and try to go from.

22:19.000 --> 22:27.000
And you're also just suggesting to remove the like just remove the enablement of the see see a few and then just.

22:27.000 --> 22:33.000
I would first enable the see a few and do some verification before I go on the software side.

22:33.000 --> 22:37.000
And and for verf like would and can you elaborate more on the verification.

22:37.000 --> 22:41.000
I use very later but who have money they use model same.

22:41.000 --> 22:42.000
Got it.

22:42.000 --> 22:43.000
So many things right.

22:43.000 --> 22:44.000
Got it.

22:44.000 --> 22:46.000
So it depends how much you know.

22:47.000 --> 22:49.000
Can you spend on that right.

23:06.000 --> 23:12.000
Yeah, maybe also to expand on the like available back in features.

23:13.000 --> 23:18.000
I just looked at it and the new RV32 also supports like on ship debugging.

23:18.000 --> 23:22.000
So another feature you can enable and then you get jetac access to it.

23:22.000 --> 23:28.000
You'll probably have to add some pin definitions because right you need for wires for jetac.

23:28.000 --> 23:32.000
You need to tell the FPGA better out those.

23:32.000 --> 23:33.000
Got it.

23:33.000 --> 23:36.000
And then you just have jetac for the CPU course.

23:36.000 --> 23:40.000
So that's maybe also another avenue you can look at.

23:41.000 --> 23:42.000
I see.

23:46.000 --> 23:52.000
You ask for the debugging tool for which let is providing you this is called reveal.

23:52.000 --> 23:55.000
You can just check with.

23:55.000 --> 23:59.000
But then you have to go through those with a tool flow and right.

23:59.000 --> 24:04.000
To localize or you have to go in and stuff to get.

24:04.000 --> 24:06.000
At the instrumentation, but this is working.

24:06.000 --> 24:09.000
As you are used to everything.

24:09.000 --> 24:13.000
Do I do I need to use to I need to use their.

24:13.000 --> 24:18.000
Kind of debugging tool with their entire work because this design was implemented.

24:18.000 --> 24:27.000
I'm not aware of any open source tool yet to do the same things that will be identified with open source.

24:27.000 --> 24:28.000
I have not seen that.

24:28.000 --> 24:31.000
I would be very glad to see that.

24:31.000 --> 24:37.000
There was a really really really all to providing some kind of that features.

24:37.000 --> 24:42.000
But it's so all that it was using them parallel port to.

24:42.000 --> 24:44.000
Collect to the GUI and things.

24:44.000 --> 24:46.000
So this is a missing piece.

24:46.000 --> 24:49.000
And as I saw you are using.

24:49.000 --> 24:52.000
Your reference implementation is in VH.

24:52.000 --> 24:55.000
So you are using G.

24:55.000 --> 24:56.000
G.

24:56.000 --> 24:57.000
Right.

24:57.000 --> 24:58.000
Yeah.

24:58.000 --> 25:01.000
So.

25:01.000 --> 25:06.000
Try to to simulate your whole design in G.

25:06.000 --> 25:09.000
Go get it working there without the hardware.

25:09.000 --> 25:10.000
Get the inside.

25:10.000 --> 25:12.000
To each year and get gt.

25:12.000 --> 25:14.000
Keywave.

25:14.000 --> 25:22.000
And you can also think about using more elaborate tools around ght to get your serial port running.

25:22.000 --> 25:23.000
As it would.

25:23.000 --> 25:24.000
Oh I see.

25:24.000 --> 25:25.000
Interesting.

25:25.000 --> 25:29.000
From my head I don't know if co code TB supports actually you are.

25:29.000 --> 25:31.000
Communication things like that.

25:31.000 --> 25:36.680
co-co-TV is wrapping around your simulator so you can put stuff inside your simulator

25:36.680 --> 25:45.160
and getting things out and to cause emulation or additional test cases or you do not describe

25:45.160 --> 25:51.960
your test cases in VHD or wherever you lock anymore but you do the whole control of your inputs

25:51.960 --> 26:00.280
and outputs in pipes and so this would be a modern way for verification of this kind of

26:01.080 --> 26:08.920
if let's say I try lattices tool flow right to build the design with let's say ccfu enabled

26:08.920 --> 26:14.120
and it works and let's say with the open source tools it doesn't like well I'm just I'm just

26:14.120 --> 26:20.040
kind of speculating if that if that were to happen then like would you would you have any suggestions

26:20.040 --> 26:25.960
on okay like on the open source workflow it's not working right do do I still go down the route of

26:26.040 --> 26:30.760
verification and you know doing test benches to make sure what's going on if that happens

26:30.760 --> 26:37.880
open a bug report on cmbflow okay because this should not happen it's the cpu is described in

26:37.880 --> 26:45.080
plane vh here so it should not matter okay cool cool god thank you your problem you see somewhere else god

26:45.880 --> 26:48.280
from my copy god thank you yeah

26:58.040 --> 27:04.680
actually if you have something that is working with latice tool not working with the open source

27:04.680 --> 27:10.440
tool it could be also maybe some timing issue sorry was a last part timing issue timing

27:10.440 --> 27:23.400
god but then wouldn't if it's but wouldn't I see like a failure in the implementation

27:23.400 --> 27:34.760
if it's failing timing god because I thought like timing timing validation is like a

27:34.760 --> 27:39.960
is binary if it passes then your design should work if it fails and like there's no gray area

27:39.960 --> 27:45.640
if it fails you get the binary but it won't work god okay and the open source tools like

27:45.640 --> 27:50.440
would you expect them to still generate a binary even if timing fails yeah that does oh they do okay

27:50.440 --> 27:59.480
like so we're already once yeah god okay thanks because because in the latest tools

27:59.480 --> 28:05.160
it didn't even let me build a binary like the the the bitstream wasn't generated

28:05.160 --> 28:11.480
if timing fails essentially so I just assume that if timing fails like it just doesn't

28:11.480 --> 28:19.960
generate a bitstream for it god it okay but but but the blue loader still boots though right so

28:20.920 --> 28:24.840
I don't know

28:39.160 --> 28:41.240
Thank you

