From 4f32ce089e538f55999a9ca53cb0d8f0804fa47f Mon Sep 17 00:00:00 2001 From: Mikael Henriksson <mike.zx@hotmail.com> Date: Tue, 21 Mar 2023 16:15:57 +0100 Subject: [PATCH] correct parameters 'rows' and 'columns' in generate_matrix_transposition() --- .../streaming_matrix_transposition_tb.vhdl | 75 +++++++++++++++++++ b_asic/research/interleaver.py | 34 ++++----- test/test_resources.py | 15 ++++ 3 files changed, 107 insertions(+), 17 deletions(-) diff --git a/b_asic/codegen/testbench/streaming_matrix_transposition_tb.vhdl b/b_asic/codegen/testbench/streaming_matrix_transposition_tb.vhdl index 8267e356..eea5950b 100644 --- a/b_asic/codegen/testbench/streaming_matrix_transposition_tb.vhdl +++ b/b_asic/codegen/testbench/streaming_matrix_transposition_tb.vhdl @@ -100,6 +100,43 @@ begin end architecture behav; +-- +-- 4x8 memory based matrix transposition +-- +library ieee, vunit_lib; +context vunit_lib.vunit_context; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity streaming_matrix_transposition_memory_4x8_tb is + generic ( + runner_cfg : string; -- VUnit python pipe + tb_path : string -- Absolute path to this testbench + ); +end entity streaming_matrix_transposition_memory_4x8_tb; + +architecture behav of streaming_matrix_transposition_memory_4x8_tb is + constant WL : integer := 16; + signal done : boolean; + signal input, output : std_logic_vector(WL-1 downto 0); + signal clk, rst, en : std_logic; +begin + + -- VUnit test runner + process begin + test_runner_setup(runner, runner_cfg); + wait until done = true; + test_runner_cleanup(runner); + end process; + + -- Run the test baby! + dut : entity work.streaming_matrix_transposition_memory_4x8 + generic map(WL=>WL) port map(clk, rst, en, input, output); + tb : entity work.streaming_matrix_transposition_tester + generic map (WL=>WL, ROWS=>4, COLS=>8) port map(clk, rst, en, input, output, done); + +end architecture behav; + -- -- 7x7 memory based matrix transposition @@ -324,3 +361,41 @@ begin generic map (WL=>WL, ROWS=>2, COLS=>2) port map(clk, rst, en, input, output, done); end architecture behav; + + +-- +-- 4x8 register based matrix transposition +-- +library ieee, vunit_lib; +context vunit_lib.vunit_context; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity streaming_matrix_transposition_register_4x8_tb is + generic ( + runner_cfg : string; -- VUnit python pipe + tb_path : string -- Absolute path to this testbench + ); +end entity streaming_matrix_transposition_register_4x8_tb; + +architecture behav of streaming_matrix_transposition_register_4x8_tb is + constant WL : integer := 16; + signal done : boolean; + signal input, output : std_logic_vector(WL-1 downto 0); + signal clk, rst, en : std_logic; +begin + + -- VUnit test runner + process begin + test_runner_setup(runner, runner_cfg); + wait until done = true; + test_runner_cleanup(runner); + end process; + + -- Run the test baby! + dut : entity work.streaming_matrix_transposition_register_4x8 + generic map(WL=>WL) port map(clk, rst, en, input, output); + tb : entity work.streaming_matrix_transposition_tester + generic map (WL=>WL, ROWS=>4, COLS=>8) port map(clk, rst, en, input, output, done); + +end architecture behav; diff --git a/b_asic/research/interleaver.py b/b_asic/research/interleaver.py index 1386ae7d..3fdcd149 100644 --- a/b_asic/research/interleaver.py +++ b/b_asic/research/interleaver.py @@ -63,23 +63,23 @@ def generate_random_interleaver( def generate_matrix_transposer( - height: int, - width: Optional[int] = None, + rows: int, + cols: Optional[int] = None, min_lifetime: int = 0, cyclic: bool = True, ) -> ProcessCollection: r""" Generate a ProcessCollection with memory variable corresponding to transposing a - matrix of size *height* :math:`\times` *width*. If *width* is not provided, a - square matrix of size *height* :math:`\times` *height* is used. + matrix of size *rows* :math:`\times` *cols*. If *cols* is not provided, a + square matrix of size *rows* :math:`\times` *rows* is used. Parameters ---------- - height : int - Matrix height. - width : int, optional - Matrix width. If not provided assumed to be equal to height, i.e., a square - matrix. + rows : int + Number of rows in input matrix. + cols : int, optional + Number of columns in input matrix. If not provided assumed to be equal + to *rows*, i.e., a square matrix. min_lifetime : int, default: 0 The minimum lifetime for a memory variable. Default is 0 meaning that at least one variable is passed from the input to the output directly, @@ -91,18 +91,18 @@ def generate_matrix_transposer( ------- ProcessCollection """ - if width is None: - width = height + if cols is None: + cols = rows inputorder = [] - for row in range(height): - for col in range(width): - inputorder.append(col + width * row) + for col in range(cols): + for row in range(rows): + inputorder.append(row + rows * col) outputorder = [] - for row in range(width): - for col in range(height): - outputorder.append(col * width + row) + for row in range(rows): + for col in range(cols): + outputorder.append(col * rows + row) inputorder, outputorder = _insert_delays( inputorder, outputorder, min_lifetime, cyclic diff --git a/test/test_resources.py b/test/test_resources.py index 582761e9..ea17a0b5 100644 --- a/test/test_resources.py +++ b/test/test_resources.py @@ -69,6 +69,21 @@ class TestProcessCollectionPlainMemoryVariable: word_length=16, ) + def test_rectangular_matrix_transposition(self): + collection = generate_matrix_transposer(rows=4, cols=8, min_lifetime=2) + assignment = collection.graph_color_cell_assignment() + collection.generate_memory_based_storage_vhdl( + filename=f'b_asic/codegen/testbench/streaming_matrix_transposition_memory_4x8.vhdl', + entity_name=f'streaming_matrix_transposition_memory_4x8', + assignment=assignment, + word_length=16, + ) + collection.generate_register_based_storage_vhdl( + filename=f'b_asic/codegen/testbench/streaming_matrix_transposition_register_4x8.vhdl', + entity_name=f'streaming_matrix_transposition_register_4x8', + word_length=16, + ) + # Issue: #175 def test_interleaver_issue175(self): with open('test/fixtures/interleaver-two-port-issue175.p', 'rb') as f: -- GitLab