URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
Compare Revisions
- This comparison shows the changes necessary to convert path
/openrisc/trunk/orpsocv2/rtl/verilog
- from Rev 503 to Rev 504
- ↔ Reverse comparison
Rev 503 → Rev 504
/include/or1200_defines.v
359,11 → 359,12
// |
// Type of ALU compare to implement |
// |
// Try either one to find what yields |
// higher clock frequencyin your case. |
// Try to find which synthesizes with |
// most efficient logic use or highest speed. |
// |
//`define OR1200_IMPL_ALU_COMP1 |
`define OR1200_IMPL_ALU_COMP2 |
//`define OR1200_IMPL_ALU_COMP2 |
`define OR1200_IMPL_ALU_COMP3 |
|
// |
// Implement Find First/Last '1' |
/or1200/or1200_alu.v
100,10 → 100,8
reg ov_we; |
wire [width-1:0] comp_a; |
wire [width-1:0] comp_b; |
`ifdef OR1200_IMPL_ALU_COMP1 |
wire a_eq_b; |
wire a_lt_b; |
`endif |
wire [width-1:0] result_sum; |
wire [width-1:0] result_and; |
wire cy_sum; |
120,6 → 118,7
// |
// Combinatorial logic |
// |
|
assign comp_a = {a[width-1] ^ comp_op[3] , a[width-2:0]}; |
assign comp_b = {b[width-1] ^ comp_op[3] , b[width-2:0]}; |
`ifdef OR1200_IMPL_ALU_COMP1 |
126,9 → 125,22
assign a_eq_b = (comp_a == comp_b); |
assign a_lt_b = (comp_a < comp_b); |
`endif |
`ifdef OR1200_IMPL_ALU_COMP3 |
assign a_eq_b = !(|result_sum); |
assign a_lt_b = comp_op[3] ? ((a[width-1] & !b[width-1]) | |
(!a[width-1] & !b[width-1] & result_sum[width-1])| |
(a[width-1] & b[width-1] & result_sum[width-1])): |
result_sum[width-1]; |
`endif |
|
`ifdef OR1200_IMPL_SUB |
`ifdef OR1200_IMPL_ALU_COMP3 |
assign cy_sub = a_lt_b; |
`else |
assign cy_sub = (comp_a < comp_b); |
`endif |
`endif |
|
`ifdef OR1200_IMPL_ADDC |
assign carry_in = (alu_op==`OR1200_ALUOP_ADDC) ? |
{{width-1{1'b0}},carry} : {width{1'b0}}; |
135,11 → 147,21
`else |
assign carry_in = {width-1{1'b0}}; |
`endif |
|
`ifdef OR1200_IMPL_ALU_COMP3 |
`ifdef OR1200_IMPL_SUB |
assign b_mux = ((alu_op==`OR1200_ALUOP_SUB) | (alu_op==`OR1200_ALUOP_COMP)) ? |
(~b)+1 : b; |
`else |
assign b_mux = (alu_op==`OR1200_ALUOP_COMP) ? (~b)+1 : b; |
`endif |
`else // ! `ifdef OR1200_IMPL_ALU_COMP3 |
`ifdef OR1200_IMPL_SUB |
assign b_mux = (alu_op==`OR1200_ALUOP_SUB) ? (~b)+1 : b; |
`else |
assign b_mux = b; |
`endif |
`endif |
`endif |
assign {cy_sum, result_sum} = (a + b_mux) + carry_in; |
// Numbers either both +ve and bit 31 of result set |
assign ov_sum = ((!a[width-1] & !b_mux[width-1]) & result_sum[width-1]) | |
409,7 → 431,29
flagcomp = 1'b0; |
endcase |
end |
`endif // `ifdef OR1200_IMPL_ALU_COMP2 |
|
`ifdef OR1200_IMPL_ALU_COMP3 |
always @(comp_op or a_eq_b or a_lt_b) begin |
case(comp_op[2:0]) // synopsys parallel_case |
`OR1200_COP_SFEQ: |
flagcomp = a_eq_b; |
`OR1200_COP_SFNE: |
flagcomp = ~a_eq_b; |
`OR1200_COP_SFGT: |
flagcomp = ~(a_eq_b | a_lt_b); |
`OR1200_COP_SFGE: |
flagcomp = ~a_lt_b; |
`OR1200_COP_SFLT: |
flagcomp = a_lt_b; |
`OR1200_COP_SFLE: |
flagcomp = a_eq_b | a_lt_b; |
default: |
flagcomp = 1'b0; |
endcase |
end |
`endif |
|
|
`ifdef OR1200_IMPL_ALU_EXT |
always @(alu_op or alu_op2 or a) begin |
/or1200/or1200_rf.v
197,29 → 197,21
else if (~wb_freeze) |
rf_we_allow <= ~flushpipe; |
|
//assign rf_we = ((spr_valid & spr_write) | (we & ~wb_freeze)) & rf_we_allow & (supv | (|rf_addrw)); |
assign rf_we = ((spr_valid & spr_write) | (we & ~wb_freeze)) & rf_we_allow; |
//assign cy_we_o = cy_we_i && rf_we; |
|
assign cy_we_o = cy_we_i && ~wb_freeze && rf_we_allow; |
|
|
// |
// CS RF A asserted when instruction reads operand A and ID stage |
// is not stalled |
// |
//assign rf_ena = rda & ~id_freeze | spr_valid; // probably works with fixed binutils |
assign rf_ena = (rda & ~id_freeze) | (spr_valid & !spr_write) | spr_cs_fe; // probably works with fixed binutils |
// assign rf_ena = 1'b1; // does not work with single-stepping |
//assign rf_ena = ~id_freeze | spr_valid; // works with broken binutils |
assign rf_ena = (rda & ~id_freeze) | (spr_valid & !spr_write) | spr_cs_fe; |
|
// |
// CS RF B asserted when instruction reads operand B and ID stage |
// is not stalled |
// |
//assign rf_enb = rdb & ~id_freeze | spr_valid; |
assign rf_enb = rdb & ~id_freeze; |
// assign rf_enb = 1'b1; |
//assign rf_enb = ~id_freeze | spr_valid; // works with broken binutils |
|
`ifdef OR1200_RFRAM_TWOPORT |
|