Welcome, Guest
You have to register before you can post on our site.



Search Forums

(Advanced Search)

Forum Statistics
» Members: 649
» Latest member: SUXIAOJIE
» Forum threads: 161
» Forum posts: 549

Full Statistics

Latest Threads
simple runtime vs full SD...
Forum: PULP General questions
Last Post: LarsKeuninckx
7 hours ago
» Replies: 0
» Views: 7
Maximum frequency obtaine...
Forum: PULP General questions
Last Post: kgf
01-18-2021, 12:57 PM
» Replies: 1
» Views: 45
μClinux on Ibex or CV32E4...
Forum: PULP General questions
Last Post: limone
01-15-2021, 07:46 AM
» Replies: 2
» Views: 100
Help to run Hello Example
Forum: PULP General questions
Last Post: igor.lima
01-12-2021, 07:00 PM
» Replies: 4
» Views: 593
[Vivado] behavioural simu...
Forum: PULP General questions
Last Post: LarsKeuninckx
01-08-2021, 01:40 PM
» Replies: 7
» Views: 628
Configuring Pulpissimo as...
Forum: PULP General questions
Last Post: FrankieTankie
01-07-2021, 03:53 PM
» Replies: 0
» Views: 128
Interrupt handling proble...
Forum: PULP General questions
Last Post: nikolas
01-06-2021, 09:59 AM
» Replies: 1
» Views: 152
The signed/unsigned opera...
Forum: PULP General questions
Last Post: kgf
01-05-2021, 10:53 AM
» Replies: 1
» Views: 164
Does Pulpissimo already c...
Forum: PULP General questions
Last Post: kgf
01-03-2021, 10:09 PM
» Replies: 3
» Views: 232
Where is the "get started...
Forum: PULP General questions
Last Post: kgf
12-29-2020, 06:45 PM
» Replies: 9
» Views: 10,135

  simple runtime vs full SDK, when to use which one?
Posted by: LarsKeuninckx - 7 hours ago - Forum: PULP General questions - No Replies

Two questions regarding the SDK.
The readme at https://github.com/pulp-platform/pulpissimo says:

"We provide a simple runtime and a full featured runtime for PULPissimo. We recommend you try out first the minimal runtime and when you hit its limitations you can try the full runtime by installing the SDK."

1. What exactly are the limitations of the "simple runtime" vs the "full runtime SDK"? When to use which one?

2. How do you switch between the simple runtime and full runtime SDK? What is the proper way to uninstall the SDK? Just delete the pulp-sdk folder and git clone again?


Print this item

  Maximum frequency obtained when synthesizing the RI5CY core multiplier with 28 FD-SOI
Posted by: Olivier - 01-18-2021, 08:57 AM - Forum: PULP General questions - Replies (1)


Out of curiosity, I'm learning more about the RI5CY core, especially the ex_stage. I read the Near-Threshold RISC-VCore With DSP Extensions for Scalable IoT Endpoint Devices paper and I got the core from the dedicated github page. Using Synopsys Design Compiler and the 28nm FD-SOI technology (the only technology available to me), I synthesized the multiplier (mult.sv) present in the RI5CY core. I obtain a maximum operating frequency of the multiplier of 200 MHz.

This frequency seems to me a little low. Considering the various documents I have seen on the internet, I would expect to obtain a frequency rather between 450 and 650 MHz.

Does anyone know if the maximum frequency of 200MHz is actually too low for the RI5CY core multiplier?

Thank you in advance.

Print this item

  μClinux on Ibex or CV32E40P?
Posted by: limone - 01-15-2021, 05:13 AM - Forum: PULP General questions - Replies (2)


I am exploring the various pros and cons to adapting 32-bit cores Ibex & CV32E40P to run μClinux (w/o MMU). If the power efficiency is not much less, I can understand the benefits of using CVA6 which can run full-featured (MMU) linux, but I am curious what the power consumption is for CVA6- I do not have access to the paper: "Slow and steady wins the race? A comparison of ultra-low-power RISC-V cores for Internet-of-Things applications." 

However I did read, "Micro-riscy is 1.6× smaller than Zero-riscy (∼11.6 kgates in UMC 65nm), has a power envelope of just 100μW at 160MHz and it is 1.4× more energy efficient than Zero-riscy on pure control code."

I would also like access to: "Near-Threshold RISC-V Core With DSP Extensions for Scalable IoT Endpoint Devices" In a low-power 28-nm FD-SOI process, a peak efficiency of 193 MOPS/mW (40 MHz and 1 mW) can be achieved." 

From reading the abstract, it appears Ibex can run at 100uW, and another core, in the 2nd article, runs at 1mW- Is that CV32E40P?

The reason I am asking is, I would like to build upon a research paper, the "Battery-Free Game Boy" in Proceedings of the ACM on Interactive, Mobile, Wearable and Ubiquitous Technologies September 2020 Article No.: 111, which uses an Ambiq Micro Apollo3 board running at sub-threshold voltage, similar to the near-threshold voltage of the RISC-V Core mentioned above. The theory is, if μClinux could be adapted to run on Ibex or CV32E40P, using external memory for RAM, an iPod, android phone, or even a laptop could be built with it and be powered by amorphous solar panels, and ultra-low power e-ink, with battery backup. Thank you.

Print this item

  Configuring Pulpissimo as IP for Vivado IP Integrator to use AXI peripherals
Posted by: FrankieTankie - 01-07-2021, 03:53 PM - Forum: PULP General questions - No Replies

I'm currently trying to set up a Pulpissimo IP Core which can be used with Vivado IP Integrator to fasten the integration of AXI peripherals. I managed so far to route the AXI slave channels to the TL domain where I added corresponding pads which can be used to create an AXI AMBA interface. As the slave interface uses a 64-bit data channel I'm going to use Xilinx data converter IP to get a 32-bit data channel. What I'm missing at the moment is AXI clock and reset channels. 
My question therefore is if the cluster clock would be suitable to use it, if there is already a dedicated AXI clock or reset, or if a dedicated clock divider for AXI has to be integrated. In the last case the question would be where to get a suitable clock signal.
Any is appreciated.

Print this item

  Interrupt handling problem
Posted by: nikolas - 01-05-2021, 03:01 PM - Forum: PULP General questions - Replies (1)

Hi there 

I have a question about the interrupt handling of a PULPissimo with a RI5CY core. 

The thing is, I am able to generate timer interrupts as long as I use the rt_api.h file and the functions, that are implemented there. Everything works fine then. 
It would be very nice now, if it is possible to write my own functions. So I took the PULPissimo datasheet and started to set the right registers. 
For testing reasons I want to generate interrupts from one of the APB Timers, jump into a callback function and toggle an LED. But that does not happen.

The program jumps once into the callback function but after never again. If I debug and set a breakpoint in the callback function, this breakpoint will never be reached twice.
Also tested the timer if everything works there as expected and it looks like the timer is fine. And in the interrupt pending register the correct bit is set but it does not jump.

My question now is, is there something else, maybe an other register or something, that I have to clear or set? Maybe I did not understand the interrupt handling right?

Would be nice if someone can help me here.

* @file    main.c
* @author    
* @brief    This is a testing program for the PULPissimo microcontroller that is implemented on a FPGA NEXYS4 board.
*        There is a hardware abstraction layer, that was created for that board. This program helps to find out
*        if everything is working as expected.
* @date    2021-01-02
* @version    v1.0
//#include <stdio.h>
#include <stdint.h>
#include "HAL/hal_gpio.h"
#include "HAL/HAL_Defines.h"
#include "HAL/hal_timer.h"
#include "HAL/hal_interrupt.h"
#include "HAL/pulpissimo.h"
//#include <rt/rt_api.h>

//int __rt_fpga_fc_frequency = 20000000;
//int __rt_fpga_periph_frequency = 10000000;
//unsigned int __rt_iodev_uart_baudrate = 115200;

* @note   -
* @brief  Callback function for timer interrupt.
* @param  -
* @return -
void callback_3(void)
 INT_MASK_R &= ~0x400; //disable timer interrupt line
 TIM_CFG_LO &= ~0x4;    //diasable timer interrupts
 INT_ACK_R  &= ~0x400; //clear interrupt ACK flag

 hal_gpio_toggle(LED0); //toggle LED0

 INT_CTR_R &= ~0x400; //clear pending interrupt flag
 INT_MASK_R |= 0x400; //enable timer interrupt line
 TIM_CFG_LO |= 0x4;   //enable timer interrupts    

int main()
 hal_gpio_init(LED0, OUTPUT); //init LED0
 hal_gpio_init(LED1, OUTPUT); //init LED1

 hal_gpio_write(LED0, LOW); //turn off LED0
 hal_gpio_write(LED1, LOW); //turn off LED1

 INT_MASK_R &= ~0xFFFFFFFF; //disable all interrupt lines
 INT_CTR_R  &= ~0xFFFFFFFF; //clear all pending interrupts
 TIM_CNT_LO &= ~0xFFFFFFFF; //set timer count register to zero
 hal_interrupt_set_handler(10, callback_3); //register callback function for timer interrupt

 hal_timer1_init(0, RTC_32KHZ, CONTINUE,CMP_RST);     //init timer
 hal_timer1_set_cmp(0xFFFF);                //set timer compare register value            
 hal_timer1_en_int(1);                    //enable timer interrupts
 hal_timer1_start();                    //start timer

   //checks if timer is running as expected
   if(TIM_CNT_LO >= 0xFFF)
    hal_gpio_write(LED1, 1);
    hal_gpio_write(LED1, 0);
 return 0;

If it helps to understand my problem, here is the little test application I would like to run. The functions, that I wrote do not much more than setting the right bits of the right registers.

Thank you very much and wish you all a nice evening

Print this item

  The signed/unsigned operation support by the Dotp-Unit of the RI5CY core
Posted by: Olivier - 01-05-2021, 09:42 AM - Forum: PULP General questions - Replies (1)

Hello and Happy New Year,

I took a look at the Near-Threshold RISC-VCore With DSP Extensions for Scalable IoT Endpoint Devices paper.

At the Dotp-Unit side, there are two 17bx17b multipliers and four 9bx9b multipliers respectively the input operands are 16b and 8b. The support of signed operations is achieved by adding a sign bit to each input operand.

The input values supported by the 17bx17b and 9bx9b multipliers should be between -65536 to 65535 and -256 to 255 respectively. With this choice, we move away from the classical short and char data types supporting data values between -32768 to 32767 and -128 to 127 respectively.

I can't understand why an extra sign bit is needed on data 16b and 8b for the execution of signed operations.
Can someone enlighten me with additional information about this choice to add an extra sign bit to data 16b and 8b?

Thank you in advance,

Print this item

  Does Pulpissimo already contain VCC & GND pins?
Posted by: traVc - 01-03-2021, 06:16 PM - Forum: PULP General questions - Replies (3)

I was wondering whether Pulpissimo already contains VCC & GND (power supply) pins or if those have to be added for ASIC design?

If they have to be added - what would be the easiest way to do so?

Print this item

  [Vivado] behavioural simulation won't start
Posted by: andrea.spitale - 12-10-2020, 11:14 AM - Forum: PULP General questions - Replies (7)

Hi there!
I'm posting here as I am having some trouble with setting up PULPissimo to be behaviourally simulated (i.e. pre synthesis) on Vivado. In order to do so, I've cloned the PULPissimo repository, then run the update ips script and finally loaded all files from ips and rtl folders into vivado project. I'll list the issues I've encountered, together with vivado logs describing the errors and warning the software detected, considering I am running a fully licensed 2020.2 version under Linux.

1) i've a huge issue with "include" files, that is the files referred by `include directives. The vivado log referring to this issue is the one named "vivado_include.log".
1.1) Initially I managed to fix some of these errors by adding the paths to the folders containing those files in "Verilog Include Files Search Paths", which is a setting that can be found by going through Project Manager -> Settings -> General(and Simulation) -> Verilog Options, but this means adding one path for every "include" error the compiler detects, so it requires a lot of work. Moreover it doesn't seem to be always working, as it didn't fix the problem when I created a new project and the log content was the same as "vivado_include.log".

2) I created another project, this time copying and including all .sv, .svh, .v files from ips and rtl PULPissimo folders, so all files are in the same folder. I had to modify the `include directives of "fpnew" IP files in order to have correct `include paths. Moreover I had to comment out the "`ifdef synthesis" directive in hwpe_ctrl_interfaces.sv, as the compiler was not able to recognize "timeunit" and "timeprecision" keywords, although it should. Then, using xilinx related scripts inside "fpga/zcu102" folder as a guideline, I created the Xilinx IPs PULPissimo requires, that is two BRAMs and two clock generators, named xilinx_clk_mngr, xilinx_slow_clk_mngr, xilinx_private_ram and xilinx_interleaved_ram. Once I ran the behavioural simulation process, the compile phase went fine, but then the elaborate one was stopped with errors listed in "vivado_elaborate.log" file. I have to say I also read some warnings during compile phase, which details are again listed in "vivado_elaborate.log".

3) I created a new project, importing all files from ip and rtl folders. I've set some of the files referred by `include directives as "verilog header" from the files properties. Then I copied the registers.svh file inside "common_cells" folder of FPNEW ip, as the compiler was not able to find it. Moreover I had to comment out the "`ifdef synthesis" directive in hwpe_ctrl_interfaces.sv. However I still encountered errors after running behavioural simulation process, one of them referring to file riscv_alu.sv, with compiler indicating that  "riscv_defines" packanot being declared.ge has not been declared. The log of this operation is inside "vivado_third_attempt.log".

All .log files are inside the attached "vivado_error_logs.zip" file.

Hope everything is clear. Thank you for your time!

Attached Files
.zip   vivado_errors_logs.zip (Size: 6.6 KB / Downloads: 0)
Print this item

  How to solve the problem of missing modules “pulpissimo”?
Posted by: LanXu - 12-08-2020, 09:05 AM - Forum: PULP General questions - Replies (1)

   I want run openPULP project in zcu104 FPGA.After i ran update_ips script,i make  zcu104 under the path ../workspace/pulp/pulp/fpga.The following error occurred:
  ERROR: [Synth 8-439] module 'pulpissimo' not found [../workspace/pulp/pulp/fpga/pulpissimo-zcu104/rtl/xilinx_pulpissimo.v:99]
   I want to know how to fix this problem,and Is it necessary to build the SDK?  Can the SDK be built on the centos7 system?and how?

Print this item

  Help to run Hello Example
Posted by: igor.lima - 12-01-2020, 08:05 PM - Forum: PULP General questions - Replies (4)


I'm new in community, i'd like some help!

I'm trying to run the Hello example from "https://github.com/pulp-platform/pulp-rt-examples" in my Nexys Video FPGA using the bitstream of Pulpissimo.

Until now i'm just following the instructions from README.md file from "https://github.com/pulp-platform/pulpissimo".

I had download and install the Toolchain from pulp-riscv-gnu-toolchain as "Newlib", could someone confirm that it is not necessary install the "Linux" version of this toolchain?

Then i installed the Standard Pulp SDK from "https://github.com/pulp-platform/pulp-sdk/#standard-sdk-build"

I had some issues following the steps, most of them are related with missing steps, like configuring bashrc or some ambient variable, but i was able to solve all of them i believe. I miss some kind of step-by-step, from rtl to running example on FPGA, is it possible create something like that? I think it could be done as a new Thread in forum for the communty, it could help a lot.

I was able to generate the bitstream of Pulpissimo and configure it in Nexys Video FPGA using the JTAG-USB connection. When i run the specific OpenOCD from Pulp-SDK, the OpenOCD is able to identify the Pulpissimo processor in FPGA.

Then i compiled the Hello Example after adding the two weakly defined variables as suggested to configure core and peripherics frequencies. It was compiled with success, the ELF file was properly generate in the build directory.

My problem happen when i had try to use GDB with ELF file to load it to L2 memory of Pulpissimo, the connection between the GDB and OpenOCD looks fine, when i use the Load command it copy the elf file to memory it looks to work fine too, but when i use the Continue command it stops and never end the execution, but it print some kind of assembly commands like;
# j    1c0080ec <__rt_illegal_instr>

So i did the check with gcc in the ELF file to check the Assembly, as suspected it was printing the assembly that has some kind of error i believe, the first piece of assembly code is like that;

test:     file format elf32-littleriscv

Disassembly of section .vectors:

1c008000 <__irq_vector_base>:
1c008000:    0ec0006f              j    1c0080ec <__rt_illegal_instr>
1c008004:    0900006f              j    1c008094 <__rt_no_irq_handler>
1c008008:    08c0006f              j    1c008094 <__rt_no_irq_handler>
1c00800c:    0880006f              j    1c008094 <__rt_no_irq_handler>
1c008010:    0840006f              j    1c008094 <__rt_no_irq_handler>
1c008014:    0800006f              j    1c008094 <__rt_no_irq_handler>
1c008018:    07c0006f              j    1c008094 <__rt_no_irq_handler>
1c00801c:    0780006f              j    1c008094 <__rt_no_irq_handler>
1c008020:    0740006f              j    1c008094 <__rt_no_irq_handler>
1c008024:    0700006f              j    1c008094 <__rt_no_irq_handler>
1c008028:    06c0006f              j    1c008094 <__rt_no_irq_handler>
1c00802c:    0680006f              j    1c008094 <__rt_no_irq_handler>
1c008030:    0640006f              j    1c008094 <__rt_no_irq_handler>
1c008034:    0600006f              j    1c008094 <__rt_no_irq_handler>
1c008038:    05c0006f              j    1c008094 <__rt_no_irq_handler>
1c00803c:    0580006f              j    1c008094 <__rt_no_irq_handler>
1c008040:    0540006f              j    1c008094 <__rt_no_irq_handler>
1c008044:    0500006f              j    1c008094 <__rt_no_irq_handler>
1c008048:    04c0006f              j    1c008094 <__rt_no_irq_handler>
1c00804c:    0480006f              j    1c008094 <__rt_no_irq_handler>
1c008050:    0440006f              j    1c008094 <__rt_no_irq_handler>
1c008054:    0400006f              j    1c008094 <__rt_no_irq_handler>
1c008058:    03c0006f              j    1c008094 <__rt_no_irq_handler>
1c00805c:    0380006f              j    1c008094 <__rt_no_irq_handler>
1c008060:    0340006f              j    1c008094 <__rt_no_irq_handler>
1c008064:    0300006f              j    1c008094 <__rt_no_irq_handler>
1c008068:    02c0006f              j    1c008094 <__rt_no_irq_handler>
1c00806c:    0280006f              j    1c008094 <__rt_no_irq_handler>
1c008070:    0240006f              j    1c008094 <__rt_no_irq_handler>
1c008074:    0200006f              j    1c008094 <__rt_no_irq_handler>
1c008078:    01c0006f              j    1c008094 <__rt_no_irq_handler>
1c00807c:    0180006f              j    1c008094 <__rt_no_irq_handler>

1c008080 <_start>:
1c008080:    0200006f              j    1c0080a0 <_entry>
1c008084:    0680006f              j    1c0080ec <__rt_illegal_instr>

1c008090 <__rt_debug_struct_ptr>:
1c008090:    0cf4                    addi    a3,sp,604
1c008092:    1c00                    addi    s0,sp,560

1c008094 <__rt_no_irq_handler>:
1c008094:    0000006f              j    1c008094 <__rt_no_irq_handler>

1c008098 <__rt_semihosting_call>:
1c008098:    00100073              ebreak
1c00809c:    00008067              ret

Disassembly of section .text:

1c0080a0 <_entry>:
1c0080a0:    7a101073              csrw    pcmr,zero
1c0080a4:    ffff9297              auipc    t0,0xffff9
1c0080a8:    d2c28293              addi    t0,t0,-724 # 1c000dd0 <_bss_start>
1c0080ac:    ffff9317              auipc    t1,0xffff9
1c0080b0:    e0030313              addi    t1,t1,-512 # 1c000eac <__l2_priv0_end>
1c0080b4:    0002a023              sw    zero,0(t0)
1c0080b8:    0291                    addi    t0,t0,4
1c0080ba:    fe62ede3              bltu    t0,t1,1c0080b4 <_entry+0x14>
1c0080be:    ffff9117              auipc    sp,0xffff9
1c0080c2:    c0210113              addi    sp,sp,-1022 # 1c000cc0 <stack>
1c0080c6:    292000ef              jal    ra,1c008358 <__rt_init>
1c0080ca:    00000513              li    a0,0
1c0080ce:    00000593              li    a1,0
1c0080d2:    00000397              auipc    t2,0x0
1c0080d6:    26438393              addi    t2,t2,612 # 1c008336 <main>
1c0080da:    000380e7              jalr    t2
1c0080de:    842a                    mv    s0,a0
1c0080e0:    350000ef              jal    ra,1c008430 <__rt_deinit>
1c0080e4:    8522                    mv    a0,s0
1c0080e6:    330010ef              jal    ra,1c009416 <exit>

1c0080ea <_fini>:
1c0080ea:    8082                    ret

1c0080ec <__rt_illegal_instr>:
1c0080ec:    fe112e23              sw    ra,-4(sp)
1c0080f0:    fea12c23              sw    a0,-8(sp)
1c0080f4:    00000517              auipc    a0,0x0
1c0080f8:    3ba50513              addi    a0,a0,954 # 1c0084ae <__rt_handle_illegal_instr>
1c0080fc:    010000ef              jal    ra,1c00810c <__rt_call_c_function>
1c008100:    ffc12083              lw    ra,-4(sp)
1c008104:    ff812503              lw    a0,-8(sp)
1c008108:    30200073              mret

1c00810c <__rt_call_c_function>:
1c00810c:    7119                    addi    sp,sp,-128
1c00810e:    c006                    sw    ra,0(sp)
1c008110:    c20e                    sw    gp,4(sp)
1c008112:    c412                    sw    tp,8(sp)
1c008114:    c616                    sw    t0,12(sp)

What could i have done to generate some kind of illegal instruction during the compiling process? is it not wrong after all?

When i use the gdb command "disas" it print the C code properly...

If you need any more information, just ask

Any help will be very helpful

Best Regards, Igor Ruschi

Print this item