aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md39
-rw-r--r--scripts/vivado/.gitignore1
-rw-r--r--scripts/vivado/synth_area.tcl8
-rw-r--r--scripts/vivado/synth_area_top.v143
-rw-r--r--scripts/vivado/synth_speed.tcl2
5 files changed, 173 insertions, 20 deletions
diff --git a/README.md b/README.md
index cc6bf91..298b272 100644
--- a/README.md
+++ b/README.md
@@ -10,8 +10,8 @@ PicoRV32 is free and open hardware licensed under the [ISC license](http://en.wi
(a license that is similar in terms to the MIT license or the 2-clause BSD license).
-Features and Typical Applications:
-----------------------------------
+Features and Typical Applications
+---------------------------------
- Small (~1000 LUTs in a 7-Series Xilinx FGPA)
- High fMAX (~250 MHz on 7-Series Xilinx FGPAs)
@@ -57,8 +57,8 @@ non-branching instructions in an external coprocessor. An implementation
of a core that implements the `MUL[H[SU|U]]` instructions is provided.
-Files in this Repository:
--------------------------
+Files in this Repository
+------------------------
#### README.md
@@ -102,8 +102,8 @@ Another simple test firmware that runs the Dhrystome benchmark.
Various scripts and examples for different (synthesis) tools and hardware architectures.
-Parameters:
------------
+Verilog Module Parameters
+-------------------------
The following Verilog module parameters can be used to configure the PicoRV32
core.
@@ -168,8 +168,8 @@ The start address of the program.
The start address of the interrupt handler.
-Performance:
-------------
+Cycles per Instruction Performance
+----------------------------------
*A short reminder: This core is optimized for size, not performance.*
@@ -344,8 +344,8 @@ Example:
timer x1, x2
-Building a pure RV32I Toolchain:
---------------------------------
+Building a pure RV32I Toolchain
+-------------------------------
The default settings in the [riscv-tools](https://github.com/riscv/riscv-tools) build
scripts will build a compiler, assembler and linker that can target any RISC-V ISA,
@@ -374,12 +374,12 @@ makes it easy to install them side-by-side with the regular riscv-tools, which
are using the name prefix `riscv64-unknown-elf-` by default.
-Evaluation: Timing on Xilinx 7-Series FPGAs
--------------------------------------------
+Evaluation: Timing and Utilization on Xilinx 7-Series FPGAs
+-----------------------------------------------------------
The following table lists the maximum clock speeds that PicoRV32 can run at on
Xilinx 7-Series FPGAs. This are the values reported by Vivado 2015.1 post
-place&route static timing analysis (report_timing).
+place&route static timing analysis with `report_timing`.
| Device | Speedgrade | Clock Period (Freq.) |
|:-------------------- |:----------:| --------------------:|
@@ -393,6 +393,18 @@ place&route static timing analysis (report_timing).
| Xilinx Virtex-7T | -2 | 2.6 ns (384 MHz) |
| Xilinx Virtex-7T | -3 | 2.4 ns (416 MHz) |
+The following table lists the resource utilization in area-optimized synthesis,
+as reported by Vivado 2015.1 post optimization with `report_utilization`. The
+"small" core is PicoRV32 configured down to a RV32E cpu, the "regular" core is
+PicoRV32 with its default settings and the "large" core is PicoRV32 with
+enabled PCPI, IRQ and MUL features.
+
+| Core Variant | Slice LUTs | LUTs as Memory |
+|:------------------ | ----------:| --------------:|
+| PicoRV32 "small" | 855 | 48 |
+| PicoRV32 "regular" | 996 | 48 |
+| PicoRV32 "large" | 1814 | 88 |
+
Todos:
------
@@ -401,5 +413,4 @@ Todos:
- Optional write-through cache
- Optional support for compressed ISA
- Improved documentation and examples
-- Code cleanups and refactoring of main FSM
diff --git a/scripts/vivado/.gitignore b/scripts/vivado/.gitignore
index 6103060..bdaae89 100644
--- a/scripts/vivado/.gitignore
+++ b/scripts/vivado/.gitignore
@@ -1,5 +1,4 @@
synth_*.log
synth_*.mmi
synth_*.bit
-synth_*.v
tab_*/
diff --git a/scripts/vivado/synth_area.tcl b/scripts/vivado/synth_area.tcl
index 3f52644..f77be21 100644
--- a/scripts/vivado/synth_area.tcl
+++ b/scripts/vivado/synth_area.tcl
@@ -1,12 +1,14 @@
read_verilog ../../picorv32.v
+read_verilog synth_area_top.v
read_xdc synth_area.xdc
synth_design -part xc7k70t-fbg676 -top picorv32_axi
-opt_design
+# synth_design -part xc7k70t-fbg676 -top top_small
+# synth_design -part xc7k70t-fbg676 -top top_regular
+# synth_design -part xc7k70t-fbg676 -top top_large
+opt_design -resynth_seq_area
report_utilization
# report_timing
-write_verilog -force synth_area.v
-
diff --git a/scripts/vivado/synth_area_top.v b/scripts/vivado/synth_area_top.v
new file mode 100644
index 0000000..559ae6e
--- /dev/null
+++ b/scripts/vivado/synth_area_top.v
@@ -0,0 +1,143 @@
+
+module top_small (
+ input clk, resetn,
+ output trap,
+
+ output mem_valid,
+ output mem_instr,
+ input mem_ready,
+
+ output [31:0] mem_addr,
+ output [31:0] mem_wdata,
+ output [ 3:0] mem_wstrb,
+ input [31:0] mem_rdata
+);
+ picorv32 #(
+ .ENABLE_COUNTERS(0),
+ .ENABLE_REGS_16_31(0),
+ .ENABLE_REGS_DUALPORT(1),
+ .LATCHED_MEM_RDATA(1)
+ ) picorv32 (
+ .clk (clk ),
+ .resetn (resetn ),
+ .trap (trap ),
+ .mem_valid(mem_valid),
+ .mem_instr(mem_instr),
+ .mem_ready(mem_ready),
+ .mem_addr (mem_addr ),
+ .mem_wdata(mem_wdata),
+ .mem_wstrb(mem_wstrb),
+ .mem_rdata(mem_rdata)
+ );
+endmodule
+
+module top_regular (
+ input clk, resetn,
+ output trap,
+
+ output mem_valid,
+ output mem_instr,
+ input mem_ready,
+
+ output [31:0] mem_addr,
+ output [31:0] mem_wdata,
+ output [ 3:0] mem_wstrb,
+ input [31:0] mem_rdata,
+
+ // Look-Ahead Interface
+ output mem_la_read,
+ output mem_la_write,
+ output [31:0] mem_la_addr,
+ output [31:0] mem_la_wdata,
+ output [ 3:0] mem_la_wstrb
+);
+ picorv32 picorv32 (
+ .clk (clk ),
+ .resetn (resetn ),
+ .trap (trap ),
+ .mem_valid (mem_valid ),
+ .mem_instr (mem_instr ),
+ .mem_ready (mem_ready ),
+ .mem_addr (mem_addr ),
+ .mem_wdata (mem_wdata ),
+ .mem_wstrb (mem_wstrb ),
+ .mem_rdata (mem_rdata ),
+ .mem_la_read (mem_la_read ),
+ .mem_la_write(mem_la_write),
+ .mem_la_addr (mem_la_addr ),
+ .mem_la_wdata(mem_la_wdata),
+ .mem_la_wstrb(mem_la_wstrb)
+ );
+endmodule
+
+module top_large (
+ input clk, resetn,
+ output trap,
+
+ output mem_valid,
+ output mem_instr,
+ input mem_ready,
+
+ output [31:0] mem_addr,
+ output [31:0] mem_wdata,
+ output [ 3:0] mem_wstrb,
+ input [31:0] mem_rdata,
+
+ // Look-Ahead Interface
+ output mem_la_read,
+ output mem_la_write,
+ output [31:0] mem_la_addr,
+ output [31:0] mem_la_wdata,
+ output [ 3:0] mem_la_wstrb,
+
+ // Pico Co-Processor Interface (PCPI)
+ output pcpi_insn_valid,
+ output [31:0] pcpi_insn,
+ output pcpi_rs1_valid,
+ output [31:0] pcpi_rs1,
+ output pcpi_rs2_valid,
+ output [31:0] pcpi_rs2,
+ input pcpi_rd_valid,
+ input [31:0] pcpi_rd,
+ input pcpi_wait,
+ input pcpi_ready,
+
+ // IRQ Interface
+ input [31:0] irq,
+ output [31:0] eoi
+);
+ picorv32 #(
+ .ENABLE_PCPI(1),
+ .ENABLE_MUL(1),
+ .ENABLE_IRQ(1)
+ ) picorv32 (
+ .clk (clk ),
+ .resetn (resetn ),
+ .trap (trap ),
+ .mem_valid (mem_valid ),
+ .mem_instr (mem_instr ),
+ .mem_ready (mem_ready ),
+ .mem_addr (mem_addr ),
+ .mem_wdata (mem_wdata ),
+ .mem_wstrb (mem_wstrb ),
+ .mem_rdata (mem_rdata ),
+ .mem_la_read (mem_la_read ),
+ .mem_la_write (mem_la_write ),
+ .mem_la_addr (mem_la_addr ),
+ .mem_la_wdata (mem_la_wdata ),
+ .mem_la_wstrb (mem_la_wstrb ),
+ .pcpi_insn_valid(pcpi_insn_valid),
+ .pcpi_insn (pcpi_insn ),
+ .pcpi_rs1_valid (pcpi_rs1_valid ),
+ .pcpi_rs1 (pcpi_rs1 ),
+ .pcpi_rs2_valid (pcpi_rs2_valid ),
+ .pcpi_rs2 (pcpi_rs2 ),
+ .pcpi_rd_valid (pcpi_rd_valid ),
+ .pcpi_rd (pcpi_rd ),
+ .pcpi_wait (pcpi_wait ),
+ .pcpi_ready (pcpi_ready ),
+ .irq (irq ),
+ .eoi (eoi )
+ );
+endmodule
+
diff --git a/scripts/vivado/synth_speed.tcl b/scripts/vivado/synth_speed.tcl
index ae81560..f3874e4 100644
--- a/scripts/vivado/synth_speed.tcl
+++ b/scripts/vivado/synth_speed.tcl
@@ -11,5 +11,3 @@ route_design
report_utilization
report_timing
-write_verilog -force synth_speed.v
-