Move log2/ispow2 to a utils package
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Tue, 22 Oct 2019 23:52:37 +0000 (10:52 +1100)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 30 Oct 2019 02:18:58 +0000 (13:18 +1100)
(Out of icache and dcache)

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Makefile
dcache.vhdl
icache.vhdl
utils.vhdl [new file with mode: 0644]

index 3056c53b4f9b27ceffd570c2ca7fee3b2c083e46..1c68ff40745da014c248db29a7d06de8c3eb3ab4 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -35,10 +35,11 @@ helpers.o:
 cache_ram.o:
 plru.o:
 plru_tb.o: plru.o
-icache.o: common.o wishbone_types.o plru.o cache_ram.o
 icache_tb.o: common.o wishbone_types.o icache.o simple_ram_behavioural.o
-dcache.o: common.o wishbone_types.o plru.o cache_ram.o
 dcache_tb.o: common.o wishbone_types.o dcache.o simple_ram_behavioural.o
+utils.o:
+icache.o: utils.o common.o wishbone_types.o plru.o cache_ram.o utils.o
+dcache.o: utils.o common.o wishbone_types.o plru.o cache_ram.o utils.o
 insn_helpers.o:
 loadstore1.o: common.o helpers.o
 logical.o: decode_types.o
index f12fd35fc6a3d6e26412971e8897eebd5b20027a..7d6e74c60f3f6c4b011ee9ae948c947f70b89a16 100644 (file)
@@ -16,6 +16,7 @@ use ieee.std_logic_1164.all;
 use ieee.numeric_std.all;
 
 library work;
+use work.utils.all;
 use work.common.all;
 use work.helpers.all;
 use work.wishbone_types.all;
@@ -44,26 +45,6 @@ entity dcache is
 end entity dcache;
 
 architecture rtl of dcache is
-    function log2(i : natural) return integer is
-        variable tmp : integer := i;
-        variable ret : integer := 0;
-    begin
-        while tmp > 1 loop
-            ret  := ret + 1;
-            tmp := tmp / 2;
-        end loop;
-        return ret;
-    end function;
-
-    function ispow2(i : integer) return boolean is
-    begin
-        if to_integer(to_unsigned(i, 32) and to_unsigned(i - 1, 32)) = 0 then
-            return true;
-        else
-            return false;
-        end if;
-    end function;
-
     -- BRAM organisation: We never access more than wishbone_data_bits at
     -- a time so to save resources we make the array only that wide, and
     -- use consecutive indices for to make a cache "line"
index 70226a8d240b17142d03141f7a4793543f97a8d9..20d57240ce6bfc37e815521b8d2ce16930bf52dd 100644 (file)
@@ -21,6 +21,7 @@ use ieee.std_logic_1164.all;
 use ieee.numeric_std.all;
 
 library work;
+use work.utils.all;
 use work.common.all;
 use work.wishbone_types.all;
 
@@ -51,26 +52,6 @@ entity icache is
 end entity icache;
 
 architecture rtl of icache is
-    function log2(i : natural) return integer is
-        variable tmp : integer := i;
-        variable ret : integer := 0;
-    begin
-        while tmp > 1 loop
-            ret  := ret + 1;
-            tmp := tmp / 2;
-        end loop;
-        return ret;
-    end function;
-
-    function ispow2(i : integer) return boolean is
-    begin
-        if to_integer(to_unsigned(i, 32) and to_unsigned(i - 1, 32)) = 0 then
-            return true;
-        else
-            return false;
-        end if;
-    end function;
-
     -- BRAM organisation: We never access more than wishbone_data_bits at
     -- a time so to save resources we make the array only that wide, and
     -- use consecutive indices for to make a cache "line"
diff --git a/utils.vhdl b/utils.vhdl
new file mode 100644 (file)
index 0000000..7238641
--- /dev/null
@@ -0,0 +1,35 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+package utils is
+
+    function log2(i : natural) return integer;
+    function ispow2(i : integer) return boolean;
+
+end utils;
+
+package body utils is
+
+    function log2(i : natural) return integer is
+        variable tmp : integer := i;
+        variable ret : integer := 0;
+    begin
+        while tmp > 1 loop
+            ret  := ret + 1;
+            tmp := tmp / 2;
+        end loop;
+        return ret;
+    end function;
+
+    function ispow2(i : integer) return boolean is
+    begin
+        if to_integer(to_unsigned(i, 32) and to_unsigned(i - 1, 32)) = 0 then
+            return true;
+        else
+            return false;
+        end if;
+    end function;
+
+end utils;
+