summaryrefslogtreecommitdiff
path: root/rtl/core
diff options
context:
space:
mode:
Diffstat (limited to 'rtl/core')
-rw-r--r--rtl/core/mul/mul.sv38
1 files changed, 24 insertions, 14 deletions
diff --git a/rtl/core/mul/mul.sv b/rtl/core/mul/mul.sv
index a5ac02f..9abee23 100644
--- a/rtl/core/mul/mul.sv
+++ b/rtl/core/mul/mul.sv
@@ -1,13 +1,33 @@
-module core_mul_mul
+module core_mul_mul // TODO: cambiar nombre a solo core_mul, ya que solo va a haber una operación para esto
#(parameter W=32)
(
input logic[W - 1:0] a,
b,
input logic clk,
- output logic[(W*2) - 1:0] q,
- output logic z,
+ output logic[(W*2) - 1:0] q, // TODO: cambiar a dos salidas de tamaño de 1 word, independientemente de W. se les puede llamar q_hi y q_lo a las dos partes de la respuesta
+ output logic z, // no hay C ni V, ya que se dejan unaffected
n
+
+ //! TODO:
+ //! como es una máquina de estados, es necesario tener también:
+ //! Entradas:
+ //! logic[w-1:0] c_hi // ya que puede ser a * b + c
+ //! logic[w-1:0] c_lo // ya que puede ser a * b + c // se necesitan un hi y un lo porque SMLAL lo requiere
+ //! logic c_big // ya que puede ser de 32bits o 64bits
+ //! logic add // ya que se tiene que avisar si se va a sumar c o no
+ //! indicar cuando se inicia la multiplicación en la máquina de estados
+ //! si la operación es signed o unsigned
+ //! logic double_word // si la salida es de tamaño word o double word
+ //! Salidas:
+ //! indicar en qué ciclo la multiplicación está lista // ya que la multiplicación es de ciclos
+ //! // variables
+ //! hay que definit un protocolo de cómo se usa este módulo
+ //! Por ejemplo:
+ //! se levanta rdy en algún momento, pero qué pasa al ciclo siguiente? se mantiene o se baja? qué sucede?
+ //! es capaz que se soporte que se haga un ready y un start? esto se define en este módulo, para que contro lo use
+ //! qué pasa si la salida es signed?
+ //! es necesario que las señales de entrada se mantengan constantes durante los ciclos?
);
logic[(W*2):0] booth;
@@ -23,16 +43,7 @@ module core_mul_mul
counter = W;
end
-always@(posedge clk or negedge rst_n) begin
- if (~rst_n) begin
- booth = { W{1'b0}, b, 0 }
- Q = booth[1:0];
- //A = booth[(W*2):W];
- //B = a;
- counter = W;
- end
- else begin
-
+always@(posedge clk) begin
A = booth[(W*2):W];
unique case(Q)
@@ -50,7 +61,6 @@ always@(posedge clk or negedge rst_n) begin
booth >>> 1;
counter = counter - 1;
- end
always_comb
if(counter == 0) begin