aboutsummaryrefslogtreecommitdiffstats
path: root/fpga_interchange/examples
diff options
context:
space:
mode:
authorgatecat <gatecat@ds0.me>2021-03-29 18:23:16 +0100
committerGitHub <noreply@github.com>2021-03-29 18:23:16 +0100
commit692d7dc26ddf21e2d38dd16aecef652ab4c0d5e3 (patch)
treeebe474f5cacc1206b083c7a09e77d431b4a61e61 /fpga_interchange/examples
parent4419c36db5556d2a7f600517d6a4b5673067579d (diff)
parentf33d02dca9f6080c2497a4e058554c9908677888 (diff)
downloadnextpnr-692d7dc26ddf21e2d38dd16aecef652ab4c0d5e3.tar.gz
nextpnr-692d7dc26ddf21e2d38dd16aecef652ab4c0d5e3.tar.bz2
nextpnr-692d7dc26ddf21e2d38dd16aecef652ab4c0d5e3.zip
Merge pull request #645 from litghost/add_counter_and_ram
FPGA interchange: Add counter and ram tests
Diffstat (limited to 'fpga_interchange/examples')
-rw-r--r--fpga_interchange/examples/README.md7
-rw-r--r--fpga_interchange/examples/chipdb.cmake22
-rw-r--r--fpga_interchange/examples/tests/CMakeLists.txt4
-rw-r--r--fpga_interchange/examples/tests/ram/CMakeLists.txt10
-rw-r--r--fpga_interchange/examples/tests/ram/basys3.pcf41
-rw-r--r--fpga_interchange/examples/tests/ram/basys3.xdc80
-rw-r--r--fpga_interchange/examples/tests/ram/ram.v134
-rw-r--r--fpga_interchange/examples/tests/ram/run.tcl17
8 files changed, 313 insertions, 2 deletions
diff --git a/fpga_interchange/examples/README.md b/fpga_interchange/examples/README.md
index c7df6d5a..6c1da117 100644
--- a/fpga_interchange/examples/README.md
+++ b/fpga_interchange/examples/README.md
@@ -29,6 +29,13 @@ Install python-fpga-interchange if not already installed:
```
git clone https://github.com/SymbiFlow/python-fpga-interchange.git
cd python-fpga-interchange.git
+#
+# Note: Recommend checking out a specific release, for example:
+#
+# git checkout v0.0.5
+#
+# Release of python-fpga-interchange library does have to match nextpnr
+# implementation.
python -m pip install -e .
```
diff --git a/fpga_interchange/examples/chipdb.cmake b/fpga_interchange/examples/chipdb.cmake
index 3cca7840..4705c0bc 100644
--- a/fpga_interchange/examples/chipdb.cmake
+++ b/fpga_interchange/examples/chipdb.cmake
@@ -51,6 +51,17 @@ function(create_rapidwright_device_db)
add_custom_target(rapidwright-${device}-device DEPENDS ${rapidwright_device_db})
set_property(TARGET rapidwright-${device}-device PROPERTY LOCATION ${rapidwright_device_db})
+ add_custom_target(rapidwright-${device}-device-yaml
+ COMMAND
+ ${PYTHON_EXECUTABLE} -mfpga_interchange.convert
+ --schema_dir ${INTERCHANGE_SCHEMA_PATH}
+ --schema device
+ --input_format capnp
+ --output_format yaml
+ ${rapidwright_device_db}
+ ${rapidwright_device_db}.yaml
+ DEPENDS ${rapidwright_device_db})
+
if (DEFINED output_target)
set(${output_target} rapidwright-${device}-device PARENT_SCOPE)
endif()
@@ -129,6 +140,17 @@ function(create_patched_device_db)
add_custom_target(${patch_name}-${device}-device DEPENDS ${output_device_file})
set_property(TARGET ${patch_name}-${device}-device PROPERTY LOCATION ${output_device_file})
+ add_custom_target(${patch_name}-${device}-device-yaml
+ COMMAND
+ ${PYTHON_EXECUTABLE} -mfpga_interchange.convert
+ --schema_dir ${INTERCHANGE_SCHEMA_PATH}
+ --schema device
+ --input_format capnp
+ --output_format yaml
+ ${output_device_file}
+ ${output_device_file}.yaml
+ DEPENDS ${output_device_file})
+
if (DEFINED output_target)
set(${output_target} ${patch_name}-${device}-device PARENT_SCOPE)
endif()
diff --git a/fpga_interchange/examples/tests/CMakeLists.txt b/fpga_interchange/examples/tests/CMakeLists.txt
index f0c6c53d..40ec8a75 100644
--- a/fpga_interchange/examples/tests/CMakeLists.txt
+++ b/fpga_interchange/examples/tests/CMakeLists.txt
@@ -1,6 +1,6 @@
add_subdirectory(wire)
add_subdirectory(const_wire)
-# FIXME: re-enable counter test as soon as post placement validity check completes successfully.
-#add_subdirectory(counter)
+add_subdirectory(counter)
+add_subdirectory(ram)
add_subdirectory(ff)
add_subdirectory(lut)
diff --git a/fpga_interchange/examples/tests/ram/CMakeLists.txt b/fpga_interchange/examples/tests/ram/CMakeLists.txt
new file mode 100644
index 00000000..4625edb3
--- /dev/null
+++ b/fpga_interchange/examples/tests/ram/CMakeLists.txt
@@ -0,0 +1,10 @@
+add_interchange_test(
+ name ram_basys3
+ family ${family}
+ device xc7a35t
+ package cpg236
+ tcl run.tcl
+ xdc basys3.xdc
+ sources ram.v
+)
+
diff --git a/fpga_interchange/examples/tests/ram/basys3.pcf b/fpga_interchange/examples/tests/ram/basys3.pcf
new file mode 100644
index 00000000..cb4191cc
--- /dev/null
+++ b/fpga_interchange/examples/tests/ram/basys3.pcf
@@ -0,0 +1,41 @@
+# basys3 100 MHz CLK
+set_io clk W5
+
+set_io tx A18
+set_io rx B18
+#
+# in[0:15] correspond with SW0-SW15 on the basys3
+set_io sw[0] V17
+set_io sw[1] V16
+set_io sw[2] W16
+set_io sw[3] W17
+set_io sw[4] W15
+set_io sw[5] V15
+set_io sw[6] W14
+set_io sw[7] W13
+set_io sw[8] V2
+set_io sw[9] T3
+set_io sw[10] T2
+set_io sw[11] R3
+set_io sw[12] W2
+set_io sw[13] U1
+set_io sw[14] T1
+set_io sw[15] R2
+
+# out[0:15] correspond with LD0-LD15 on the basys3
+set_io led[0] U16
+set_io led[1] E19
+set_io led[2] U19
+set_io led[3] V19
+set_io led[4] W18
+set_io led[5] U15
+set_io led[6] U14
+set_io led[7] V14
+set_io led[8] V13
+set_io led[9] V3
+set_io led[10] W3
+set_io led[11] U3
+set_io led[12] P3
+set_io led[13] N3
+set_io led[14] P1
+set_io led[15] L1
diff --git a/fpga_interchange/examples/tests/ram/basys3.xdc b/fpga_interchange/examples/tests/ram/basys3.xdc
new file mode 100644
index 00000000..58e1859c
--- /dev/null
+++ b/fpga_interchange/examples/tests/ram/basys3.xdc
@@ -0,0 +1,80 @@
+# basys3 100 MHz CLK
+set_property PACKAGE_PIN W5 [get_ports clk]
+
+set_property PACKAGE_PIN A18 [get_ports tx]
+set_property PACKAGE_PIN B18 [get_ports rx]
+#
+# in[0:15] correspond with SW0-SW15 on the basys3
+set_property PACKAGE_PIN V17 [get_ports sw[0]]
+set_property PACKAGE_PIN V16 [get_ports sw[1]]
+set_property PACKAGE_PIN W16 [get_ports sw[2]]
+set_property PACKAGE_PIN W17 [get_ports sw[3]]
+set_property PACKAGE_PIN W15 [get_ports sw[4]]
+set_property PACKAGE_PIN V15 [get_ports sw[5]]
+set_property PACKAGE_PIN W14 [get_ports sw[6]]
+set_property PACKAGE_PIN W13 [get_ports sw[7]]
+set_property PACKAGE_PIN V2 [get_ports sw[8]]
+set_property PACKAGE_PIN T3 [get_ports sw[9]]
+set_property PACKAGE_PIN T2 [get_ports sw[10]]
+set_property PACKAGE_PIN R3 [get_ports sw[11]]
+set_property PACKAGE_PIN W2 [get_ports sw[12]]
+set_property PACKAGE_PIN U1 [get_ports sw[13]]
+set_property PACKAGE_PIN T1 [get_ports sw[14]]
+set_property PACKAGE_PIN R2 [get_ports sw[15]]
+
+# out[0:15] correspond with LD0-LD15 on the basys3
+set_property PACKAGE_PIN U16 [get_ports led[0]]
+set_property PACKAGE_PIN E19 [get_ports led[1]]
+set_property PACKAGE_PIN U19 [get_ports led[2]]
+set_property PACKAGE_PIN V19 [get_ports led[3]]
+set_property PACKAGE_PIN W18 [get_ports led[4]]
+set_property PACKAGE_PIN U15 [get_ports led[5]]
+set_property PACKAGE_PIN U14 [get_ports led[6]]
+set_property PACKAGE_PIN V14 [get_ports led[7]]
+set_property PACKAGE_PIN V13 [get_ports led[8]]
+set_property PACKAGE_PIN V3 [get_ports led[9]]
+set_property PACKAGE_PIN W3 [get_ports led[10]]
+set_property PACKAGE_PIN U3 [get_ports led[11]]
+set_property PACKAGE_PIN P3 [get_ports led[12]]
+set_property PACKAGE_PIN N3 [get_ports led[13]]
+set_property PACKAGE_PIN P1 [get_ports led[14]]
+set_property PACKAGE_PIN L1 [get_ports led[15]]
+
+set_property IOSTANDARD LVCMOS33 [get_ports clk]
+
+set_property IOSTANDARD LVCMOS33 [get_ports tx]
+set_property IOSTANDARD LVCMOS33 [get_ports rx]
+#
+set_property IOSTANDARD LVCMOS33 [get_ports sw[0]]
+set_property IOSTANDARD LVCMOS33 [get_ports sw[1]]
+set_property IOSTANDARD LVCMOS33 [get_ports sw[2]]
+set_property IOSTANDARD LVCMOS33 [get_ports sw[3]]
+set_property IOSTANDARD LVCMOS33 [get_ports sw[4]]
+set_property IOSTANDARD LVCMOS33 [get_ports sw[5]]
+set_property IOSTANDARD LVCMOS33 [get_ports sw[6]]
+set_property IOSTANDARD LVCMOS33 [get_ports sw[7]]
+set_property IOSTANDARD LVCMOS33 [get_ports sw[8]]
+set_property IOSTANDARD LVCMOS33 [get_ports sw[9]]
+set_property IOSTANDARD LVCMOS33 [get_ports sw[10]]
+set_property IOSTANDARD LVCMOS33 [get_ports sw[11]]
+set_property IOSTANDARD LVCMOS33 [get_ports sw[12]]
+set_property IOSTANDARD LVCMOS33 [get_ports sw[13]]
+set_property IOSTANDARD LVCMOS33 [get_ports sw[14]]
+set_property IOSTANDARD LVCMOS33 [get_ports sw[15]]
+
+set_property IOSTANDARD LVCMOS33 [get_ports led[0]]
+set_property IOSTANDARD LVCMOS33 [get_ports led[1]]
+set_property IOSTANDARD LVCMOS33 [get_ports led[2]]
+set_property IOSTANDARD LVCMOS33 [get_ports led[3]]
+set_property IOSTANDARD LVCMOS33 [get_ports led[4]]
+set_property IOSTANDARD LVCMOS33 [get_ports led[5]]
+set_property IOSTANDARD LVCMOS33 [get_ports led[6]]
+set_property IOSTANDARD LVCMOS33 [get_ports led[7]]
+set_property IOSTANDARD LVCMOS33 [get_ports led[8]]
+set_property IOSTANDARD LVCMOS33 [get_ports led[9]]
+set_property IOSTANDARD LVCMOS33 [get_ports led[10]]
+set_property IOSTANDARD LVCMOS33 [get_ports led[11]]
+set_property IOSTANDARD LVCMOS33 [get_ports led[12]]
+set_property IOSTANDARD LVCMOS33 [get_ports led[13]]
+set_property IOSTANDARD LVCMOS33 [get_ports led[14]]
+set_property IOSTANDARD LVCMOS33 [get_ports led[15]]
diff --git a/fpga_interchange/examples/tests/ram/ram.v b/fpga_interchange/examples/tests/ram/ram.v
new file mode 100644
index 00000000..aec5c4d1
--- /dev/null
+++ b/fpga_interchange/examples/tests/ram/ram.v
@@ -0,0 +1,134 @@
+module ram0(
+ // Write port
+ input wrclk,
+ input [15:0] di,
+ input wren,
+ input [9:0] wraddr,
+ // Read port
+ input rdclk,
+ input rden,
+ input [9:0] rdaddr,
+ output reg [15:0] do);
+
+ (* ram_style = "block" *) reg [15:0] ram[0:1023];
+
+ initial begin
+ ram[0] = 16'b00000000_00000001;
+ ram[1] = 16'b10101010_10101010;
+ ram[2] = 16'b01010101_01010101;
+ ram[3] = 16'b11111111_11111111;
+ ram[4] = 16'b11110000_11110000;
+ ram[5] = 16'b00001111_00001111;
+ ram[6] = 16'b11001100_11001100;
+ ram[7] = 16'b00110011_00110011;
+ ram[8] = 16'b00000000_00000010;
+ ram[9] = 16'b00000000_00000100;
+ end
+
+ always @ (posedge wrclk) begin
+ if(wren == 1) begin
+ ram[wraddr] <= di;
+ end
+ end
+
+ always @ (posedge rdclk) begin
+ if(rden == 1) begin
+ do <= ram[rdaddr];
+ end
+ end
+
+endmodule
+
+module top (
+ input wire clk,
+
+ input wire rx,
+ output wire tx,
+
+ input wire [15:0] sw,
+ output wire [15:0] led
+);
+ wire rden;
+ reg wren;
+ wire [9:0] rdaddr;
+ wire [9:0] wraddr;
+ wire [15:0] di;
+ wire [15:0] do;
+ ram0 ram(
+ .wrclk(clk),
+ .di(di),
+ .wren(wren),
+ .wraddr(wraddr),
+ .rdclk(clk),
+ .rden(rden),
+ .rdaddr(rdaddr),
+ .do(do)
+ );
+
+ reg [9:0] address_reg;
+ reg [15:0] data_reg;
+ reg [15:0] out_reg;
+
+ assign rdaddr = address_reg;
+ assign wraddr = address_reg;
+
+ // display_mode == 00 -> ram[address_reg]
+ // display_mode == 01 -> address_reg
+ // display_mode == 10 -> data_reg
+ wire [1:0] display_mode;
+
+ // input_mode == 00 -> in[9:0] -> address_reg
+ // input_mode == 01 -> in[7:0] -> data_reg[7:0]
+ // input_mode == 10 -> in[7:0] -> data_reg[15:8]
+ // input_mode == 11 -> data_reg -> ram[address_reg]
+ wire [1:0] input_mode;
+
+ // WE == 0 -> address_reg and data_reg unchanged.
+ // WE == 1 -> address_reg or data_reg is updated because on input_mode.
+ wire we;
+
+ assign display_mode[0] = sw[14];
+ assign display_mode[1] = sw[15];
+
+ assign input_mode[0] = sw[12];
+ assign input_mode[1] = sw[13];
+
+ assign we = sw[11];
+ assign led = out_reg;
+ assign di = data_reg;
+ assign rden = 1;
+
+ initial begin
+ address_reg = 10'b0;
+ data_reg = 16'b0;
+ out_reg = 16'b0;
+ end
+
+ always @ (posedge clk) begin
+ if(display_mode == 0) begin
+ out_reg <= do;
+ end else if(display_mode == 1) begin
+ out_reg <= address_reg;
+ end else if(display_mode == 2) begin
+ out_reg <= data_reg;
+ end
+
+ if(we == 1) begin
+ if(input_mode == 0) begin
+ address_reg <= sw[9:0];
+ wren <= 0;
+ end else if(input_mode == 1) begin
+ data_reg[7:0] <= sw[7:0];
+ wren <= 0;
+ end else if(input_mode == 2) begin
+ data_reg[15:8] <= sw[7:0];
+ wren <= 0;
+ end else if(input_mode == 3) begin
+ wren <= 1;
+ end
+ end
+ end
+
+ // Uart loopback
+ assign tx = rx;
+endmodule
diff --git a/fpga_interchange/examples/tests/ram/run.tcl b/fpga_interchange/examples/tests/ram/run.tcl
new file mode 100644
index 00000000..79321139
--- /dev/null
+++ b/fpga_interchange/examples/tests/ram/run.tcl
@@ -0,0 +1,17 @@
+yosys -import
+
+foreach src $::env(SOURCES) {
+ read_verilog $src
+}
+
+synth_xilinx -flatten -nolutram -nowidelut -nosrl -nocarry -nodsp
+techmap -map $::env(TECHMAP)
+
+# opt_expr -undriven makes sure all nets are driven, if only by the $undef
+# net.
+opt_expr -undriven
+opt_clean
+
+setundef -zero -params
+
+write_json $::env(OUT_JSON)