summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--conspiracion.qsf4
-rw-r--r--rtl/core/control/control.sv31
-rw-r--r--rtl/core/control/mux.sv50
3 files changed, 59 insertions, 26 deletions
diff --git a/conspiracion.qsf b/conspiracion.qsf
index bb744e3..a37e005 100644
--- a/conspiracion.qsf
+++ b/conspiracion.qsf
@@ -137,7 +137,10 @@ set_global_assignment -name SYSTEMVERILOG_FILE rtl/core/alu/orr.sv
set_global_assignment -name SYSTEMVERILOG_FILE rtl/core/alu/xor.sv
set_global_assignment -name SYSTEMVERILOG_FILE rtl/core/arm810.sv
set_global_assignment -name SYSTEMVERILOG_FILE rtl/core/control/control.sv
+set_global_assignment -name SYSTEMVERILOG_FILE rtl/core/control/cycles.sv
+set_global_assignment -name SYSTEMVERILOG_FILE rtl/core/control/mux.sv
set_global_assignment -name SYSTEMVERILOG_FILE rtl/core/control/ldst/pop.sv
+set_global_assignment -name SYSTEMVERILOG_FILE rtl/core/control/stall.sv
set_global_assignment -name SYSTEMVERILOG_FILE rtl/core/decode/branch.sv
set_global_assignment -name SYSTEMVERILOG_FILE rtl/core/decode/conds.sv
set_global_assignment -name SYSTEMVERILOG_FILE rtl/core/decode/data.sv
@@ -253,4 +256,5 @@ set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to memory_
set_instance_assignment -name IO_STANDARD "SSTL-15 CLASS I" -to memory_mem_dm -tag __hps_sdram_p0
set_instance_assignment -name OUTPUT_TERMINATION "SERIES 50 OHM WITH CALIBRATION" -to memory_mem_dm -tag __hps_sdram_p0
+
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file
diff --git a/rtl/core/control/control.sv b/rtl/core/control/control.sv
index 2c5c6f1..059cb2d 100644
--- a/rtl/core/control/control.sv
+++ b/rtl/core/control/control.sv
@@ -89,34 +89,13 @@ module core_control
.pop_lower(popped_lower)
);
- always_comb begin
- unique case(cycle)
- RD_INDIRECT_SHIFT: shifter_shift = rd_value_b[7:0];
- default: shifter_shift = {2'b00, data_shift_imm};
- endcase
-
- unique case(cycle)
- TRANSFER: alu_a = saved_base;
- EXCEPTION: alu_a = {pc, 2'b00};
- default: alu_a = rd_value_a;
- endcase
-
- unique case(cycle)
- RD_INDIRECT_SHIFT, WITH_SHIFT:
- alu_b = saved_base;
-
- TRANSFER:
- alu_b = mem_offset;
-
- default:
- if(data_snd_is_imm)
- alu_b = {{20{1'b0}}, data_imm};
- else
- alu_b = rd_value_b;
- endcase
+ core_control_mux mux
+ (
+ .*
+ );
+ always_comb
vector_offset = 3'b001; //TODO
- end
always_ff @(posedge clk) begin
branch <= 0;
diff --git a/rtl/core/control/mux.sv b/rtl/core/control/mux.sv
new file mode 100644
index 0000000..58d2197
--- /dev/null
+++ b/rtl/core/control/mux.sv
@@ -0,0 +1,50 @@
+`include "core/uarch.sv"
+
+module core_control_mux
+(
+ input logic clk,
+
+ input word rd_value_a,
+ rd_value_b,
+
+ input ctrl_cycle cycle,
+ input logic data_snd_is_imm,
+ input logic[5:0] data_shift_imm,
+ input logic[11:0] data_imm,
+ input ptr pc,
+ input word saved_base,
+ mem_offset,
+
+ output word alu_a,
+ alu_b,
+ output logic[7:0] shifter_shift
+);
+
+ always_comb begin
+ unique case(cycle)
+ RD_INDIRECT_SHIFT: shifter_shift = rd_value_b[7:0];
+ default: shifter_shift = {2'b00, data_shift_imm};
+ endcase
+
+ unique case(cycle)
+ TRANSFER: alu_a = saved_base;
+ EXCEPTION: alu_a = {pc, 2'b00};
+ default: alu_a = rd_value_a;
+ endcase
+
+ unique case(cycle)
+ RD_INDIRECT_SHIFT, WITH_SHIFT:
+ alu_b = saved_base;
+
+ TRANSFER:
+ alu_b = mem_offset;
+
+ default:
+ if(data_snd_is_imm)
+ alu_b = {{20{1'b0}}, data_imm};
+ else
+ alu_b = rd_value_b;
+ endcase
+ end
+
+endmodule