OpenCores
URL https://opencores.org/ocsvn/oc54x/oc54x/trunk

Subversion Repositories oc54x

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 4 to Rev 5
    Reverse comparison

Rev 4 → Rev 5

/c54x/tags/initial/rtl/verilog/timescale.v File deleted \ No newline at end of file
c54x/tags Property changes : Deleted: svn:mergeinfo ## -0,0 +0,0 ## Index: c54x/trunk/rtl/verilog/oc54_acc.v =================================================================== --- c54x/trunk/rtl/verilog/oc54_acc.v (revision 4) +++ c54x/trunk/rtl/verilog/oc54_acc.v (nonexistent) @@ -1,143 +0,0 @@ -///////////////////////////////////////////////////////////////////// -//// //// -//// OpenCores54 DSP, accumulator //// -//// //// -//// Author: Richard Herveille //// -//// richard@asics.ws //// -//// www.asics.ws //// -//// //// -///////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2002 Richard Herveille //// -//// richard@asics.ws //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer.//// -//// //// -//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// -//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// -//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// -//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// -//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// -//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// -//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// -//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// -//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// -//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// -//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// -//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// -//// POSSIBILITY OF SUCH DAMAGE. //// -//// //// -///////////////////////////////////////////////////////////////////// - -// -// Xilinx Virtex-E WC: 96 CLB slices @ 51MHz -// - -// CVS Log -// -// $Id: oc54_acc.v,v 1.1.1.1 2002-04-10 09:34:39 rherveille Exp $ -// -// $Date: 2002-04-10 09:34:39 $ -// $Revision: 1.1.1.1 $ -// $Author: rherveille $ -// $Locker: $ -// $State: Exp $ -// -// Change History: -// $Log: not supported by cvs2svn $ - -`include "timescale.v" - -module oc54_acc ( - clk, ena, - seli, we, - a, b, alu, mac, - ovm, rnd, - zf, ovf, - result, bp_result - ); - -// -// parameters -// - -// -// inputs & outputs -// -input clk; -input ena; -input [ 1:0] seli; // select input -input we; // write enable -input [39:0] a, b, alu, mac; // accumulators, alu, mac input -input ovm, rnd; // overflow mode, saturate, round -output ovf, zf; // carry out, overflow, zero, tc-out -output [39:0] result; // accumulator register output -output [39:0] bp_result; // accumulator register bypass output - -reg ovf, zf; -reg [39:0] result; - -// -// variables -// -reg [39: 0] sel_r, iresult; // select results, final result -wire iovf; - -// -// module body -// - -// -// generate input selection -// - -// input selection & MAC-rounding -always@(seli or a or b or alu or mac or rnd) - case(seli) // synopsis full_case parallel_case - 2'b00: sel_r = a; - 2'b01: sel_r = b; - 2'b10: sel_r = alu; - 2'b11: sel_r = rnd ? (mac + 16'h8000) & 40'hff_ffff_0000 : mac; - endcase - -// overflow detection -// no overflow when: -// 1) all guard bits are set (valid negative number) -// 2) no guard bits are set (valid positive number) -assign iovf = !( &sel_r[39:32] | &(~sel_r[39:32]) ); - -// saturation -always@(iovf or ovm or sel_r) - if (ovm & iovf) - if (sel_r[39]) // negate overflow - iresult <= #1 40'hff_8000_0000; - else // positive overflow - iresult <= #1 40'h00_7fff_ffff; - else - iresult <= #1 sel_r; - -// -// generate registers -// - -// generate bypass output -assign bp_result = iresult; - -// result -always@(posedge clk) - if (ena & we) - result <= #1 iresult; - -// ovf, zf -always@(posedge clk) - if (ena & we) - begin - ovf <= #1 iovf; - zf <= #1 ~|iresult; - end - -endmodule - Index: c54x/trunk/rtl/verilog/oc54_bshft.v =================================================================== --- c54x/trunk/rtl/verilog/oc54_bshft.v (revision 4) +++ c54x/trunk/rtl/verilog/oc54_bshft.v (nonexistent) @@ -1,164 +0,0 @@ -///////////////////////////////////////////////////////////////////// -//// //// -//// OpenCores54 DSP, Barrel Shifter //// -//// //// -//// Author: Richard Herveille //// -//// richard@asics.ws //// -//// www.asics.ws //// -//// //// -///////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2002 Richard Herveille //// -//// richard@asics.ws //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer.//// -//// //// -//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// -//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// -//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// -//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// -//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// -//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// -//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// -//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// -//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// -//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// -//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// -//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// -//// POSSIBILITY OF SUCH DAMAGE. //// -//// //// -///////////////////////////////////////////////////////////////////// - -// -// Xilinx Virtex-E WC: 348 CLB slices @ 68MHz -// - -// CVS Log -// -// $Id: oc54_bshft.v,v 1.1.1.1 2002-04-10 09:34:40 rherveille Exp $ -// -// $Date: 2002-04-10 09:34:40 $ -// $Revision: 1.1.1.1 $ -// $Author: rherveille $ -// $Locker: $ -// $State: Exp $ -// -// Change History: -// $Log: not supported by cvs2svn $ - -`include "timescale.v" - -module oc54_bshft ( - clk, ena, - a, b, cb, db, - bp_a, bp_b, bp_ar, bp_br, - l_na, sxm, seli, selo, - t, asm, imm, - result, co - ); - -// -// parameters -// - -// -// inputs & outputs -// -input clk; -input ena; -input [39:0] a, b; // accumulator -input [15:0] cb, db; // memory data inputs -input [39:0] bp_ar, bp_br; // bypass a register, bypass b register -input bp_a, bp_b; // bypass select -input sxm; // sign extend mode -input l_na; // logical/not arithmetic shift -input [ 1:0] seli; // select operand (input) -input [ 1:0] selo; // select operator -input [ 5:0] t; // TREG, 6lsbs -input [ 4:0] asm; // asm bits -input [ 4:0] imm; // 5bit immediate value -output [39:0] result; -output co; // carry out output - -reg [39:0] result; -reg co; - -// -// variables -// - -reg [ 5:0] shift_cnt; -reg [39:0] operand; - -// -// module body -// - - -// -// generate shift count -// -always@(selo or t or asm or imm) - case (selo) // synopsis full_case parallel_case - 2'b00: shift_cnt = t; - 2'b01: shift_cnt = {asm[4], asm}; - 2'b10: shift_cnt = {imm[4], imm}; - 2'b11: shift_cnt = {imm[4:3], imm[3:0]}; - endcase - -// -// generate operand -// -always@(seli or bp_a or a or bp_ar or bp_b or b or bp_br or cb or db) - case (seli) // synopsis full_case parallel_case - 2'b00 : operand = bp_b ? bp_br : b; - 2'b01 : operand = bp_a ? bp_ar : a; - 2'b10 : operand = db; // 16bit operand databus - 2'b11 : operand = {cb, db}; // 32bit operand - endcase - -// -// generate shifter -// -always@(posedge clk) - if (ena) - if (l_na) // logical shift - if (shift_cnt[5]) - begin - result[39:32] <= #1 8'h0; - result[31: 0] <= #1 operand[31:0] >> (~shift_cnt[4:0] +1'h1); - co <= #1 operand[ ~shift_cnt[4:0] ]; - end - else if ( ~|shift_cnt[4:0] ) - begin - result <= #1 operand; - co <= #1 1'b0; - end - else - begin - result[39:32] <= #1 8'h0; - result[31: 0] <= #1 operand[31:0] << shift_cnt[4:0]; - co <= #1 operand[ 5'h1f - shift_cnt[4:0] ]; - end - else // arithmetic shift - if (shift_cnt[5]) - begin - if (sxm) - result <= #1 { {16{operand[39]}} ,operand} >> (~shift_cnt[4:0] +1'h1); - else - result <= #1 operand >> (~shift_cnt[4:0] +1'h1); - co <= #1 operand[ ~shift_cnt[4:0] ]; - end - else - begin - result <= #1 operand << shift_cnt[4:0]; - co <= #1 operand[ 6'h27 - shift_cnt[4:0] ]; - end - -endmodule - - - Index: c54x/trunk/rtl/verilog/oc54_cpu.v =================================================================== --- c54x/trunk/rtl/verilog/oc54_cpu.v (revision 4) +++ c54x/trunk/rtl/verilog/oc54_cpu.v (nonexistent) @@ -1,287 +0,0 @@ -///////////////////////////////////////////////////////////////////// -//// //// -//// OpenCores54 DSP, CPU //// -//// //// -//// Author: Richard Herveille //// -//// richard@asics.ws //// -//// www.asics.ws //// -//// //// -///////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2002 Richard Herveille //// -//// richard@asics.ws //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer.//// -//// //// -//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// -//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// -//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// -//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// -//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// -//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// -//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// -//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// -//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// -//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// -//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// -//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// -//// POSSIBILITY OF SUCH DAMAGE. //// -//// //// -///////////////////////////////////////////////////////////////////// - -// -// NOTE: Read the pipeline information for the CMPS instruction -// - -// -// Xilinx Virtex-E WC: 41 CLB slices @ 130MHz -// - -// CVS Log -// -// $Id: oc54_cpu.v,v 1.1.1.1 2002-04-10 09:34:41 rherveille Exp $ -// -// $Date: 2002-04-10 09:34:41 $ -// $Revision: 1.1.1.1 $ -// $Author: rherveille $ -// $Locker: $ -// $State: Exp $ -// -// Change History: -// $Log: not supported by cvs2svn $ - -`include "timescale.v" - -module oc54_cpu ( - clk_i, - ena_mac_i, ena_alu_i, ena_bs_i, ena_exp_i, - ena_treg_i, ena_acca_i, ena_accb_i, - - // mac - mac_sel_xm_i, mac_sel_ym_i, mac_sel_ya_i, - mac_xm_sx_i, mac_ym_sx_i, mac_add_sub_i, - - // alu - alu_inst_i, alu_sel_i, alu_doublet_i, - - // bs - bs_sel_i, bs_selo_i, l_na_i, - cssu_sel_i, is_cssu_i, - - // - exp_sel_i, treg_sel_i, - acca_sel_i, accb_sel_i, - - // common - pb_i, cb_i, db_i, - bp_a_i, bp_b_i, - - ovm_i, frct_i, smul_i, sxm_i, c16_i, rnd_i, - c_i, tc_i, - asm_i, imm_i, - - // outputs - c_alu_o, c_bs_o, tc_cssu_o, tc_alu_o, - ovf_a_o, zf_a_o, ovf_b_o, zf_b_o, - trn_o, eb_o - ); - -// -// parameters -// - -// -// inputs & outputs -// -input clk_i; -input ena_mac_i, ena_alu_i, ena_bs_i, ena_exp_i; -input ena_treg_i, ena_acca_i, ena_accb_i; -input [ 1:0] mac_sel_xm_i, mac_sel_ym_i, mac_sel_ya_i; -input mac_xm_sx_i, mac_ym_sx_i, mac_add_sub_i; -input [ 6:0] alu_inst_i; -input [ 1:0] alu_sel_i; -input alu_doublet_i; -input [ 1:0] bs_sel_i, bs_selo_i; -input l_na_i; -input cssu_sel_i, is_cssu_i; -input exp_sel_i, treg_sel_i; -input [ 1:0] acca_sel_i, accb_sel_i; -input [15:0] pb_i, cb_i, db_i; -input bp_a_i, bp_b_i; -input ovm_i, frct_i, smul_i, sxm_i; -input c16_i, rnd_i, c_i, tc_i, asm_i, imm_i; -output c_alu_o, c_bs_o, tc_cssu_o, tc_alu_o; -output ovf_a_o, zf_a_o, ovf_b_o, zf_b_o; -output [15:0] trn_o, eb_o; - -// -// variables -// - -wire [39:0] acc_a, acc_b, bp_ar, bp_br; -wire [39:0] mac_result, alu_result, bs_result; -wire [15:0] treg; -wire [ 5:0] exp_result; - -// -// module body -// - - // - // instantiate MAC - oc54_mac cpu_mac( - .clk(clk_i), // clock input - .ena(ena_mac_i), // MAC clock enable input - .a(acc_a), // accumulator A input - .b(acc_b), // accumulator B input - .t(treg), // TREG input - .p(pb_i), // Program Data Bus input - .c(cb_i), // Coefficient Data Bus input - .d(db_i), // Data Bus input - .sel_xm(mac_sel_xm_i), // select multiplier-X input - .sel_ym(mac_sel_ym_i), // select muliplier-Y input - .sel_ya(mac_sel_ya_i), // select adder-Y input - .bp_a(bp_a_i), // bypass accumulator A select input - .bp_b(bp_b_i), // bypass accumulator B select input - .bp_ar(bp_ar), // bypass accumulator A input - .bp_br(bp_br), // bypass accumulator B input - .xm_s(mac_xm_sx_i), // sign extend multiplier x-input - .ym_s(mac_ym_sx_i), // sign extend multiplier y-input - .ovm(ovm_i), // overflow mode input - .frct(frct_i), // fractional mode input - .smul(smul_i), // saturate on multiply input - .add_sub(mac_add_sub_i), // add/subtract input - .result(mac_result) // MAC result output - ); - - // - // instantiate ALU - oc54_alu cpu_alu( - .clk(clk_i), // clock input - .ena(ena_alu_i), // ALU clock enable input - .inst(alu_inst_i), // ALU instruction - .seli(alu_sel_i), // ALU x-input select - .doublet(alu_doublet_i), // double t {treg, treg} - .a(acc_a), // accumulator A input - .b(acc_b), // accumulator B input - .s(bs_result), // barrel shifter result input - .t(treg), // TREG input - .cb(cb_i), // Coefficient Data Bus input - .bp_a(bp_a_i), // bypass accumulator A select input - .bp_b(bp_b_i), // bypass accumulator B select input - .bp_ar(bp_ar), // bypass accumulator A input - .bp_br(bp_br), // bypass accumulator B input - .c16(c16_i), // c16 (double 16/long-word) input - .sxm(sxm_i), // sign extend mode input - .ci(c_i), // carry input - .tci(tc_i), // test/control flag input - .co(c_alu_o), // ALU carry output - .tco(tc_alu_o), // ALU test/control flag output - .result(alu_result) // ALU result output - ); - - // - // instantiate barrel shifter - oc54_bshft cpu_bs( - .clk(clk_i), // clock input - .ena(ena_bs_i), // BS clock enable input - .seli(bs_sel_i), // BS operand select input - .a(acc_a), // accumulator A input - .b(acc_b), // accumulator B input - .cb(cb_i), // Coefficient Data Bus input - .db(db_i), // Data Bus input - .bp_a(bp_a_i), // bypass accumulator A select input - .bp_b(bp_b_i), // bypass accumulator B select input - .bp_ar(bp_ar), // bypass accumulator A input - .bp_br(bp_br), // bypass accumulator B input - .selo(bs_selo_i), // BS operator select input - .t(treg), // TREG input - .asm(asm_i), // Accumulator Shift Mode input - .imm(imm_i), // Opcode Immediate input - .l_na(l_na_i), // BS logical/arithmetic shift mode input - .sxm(sxm_i), // sign extend mode input - .co(c_bs_o), // BS carry output (1 cycle ahead) - .result(bs_result) // BS result output - ); - - // instantiate Compare Select Store Unit - oc54_cssu cpu_cssu( - .clk(clk_i), // clock input - .ena(ena_bs_i), // BS/CSSU clock enable input - .sel_acc(cssu_sel_i), // CSSU accumulator select input - .a(acc_a), // accumulator A input - .b(acc_b), // accumulator B input - .s(bs_result), // BarrelShifter result input - .is_cssu(is_cssu_i), // CSSU/NormalShift operation - .tco(tc_cssu_o), // test/control flag output - .trn(trn_o), // Transition register output - .result(eb_o) // Result Data Bus output - ); - - // - // instantiate Exponent Encoder - oc54_exp cpu_exp_enc( - .clk(clk_i), // clock input - .ena(ena_exp_i), // Exponent Encoder clock enable input - .sel_acc(exp_sel_i), // ExpE. accumulator select input - .a(acc_a), // accumulator A input - .b(acc_b), // accumulator B input - .bp_a(bp_a_i), // bypass accumulator A select input - .bp_b(bp_b_i), // bypass accumulator B select input - .bp_ar(bp_ar), // bypass accumulator A input - .bp_br(bp_br), // bypass accumulator B input - .result(exp_result) // Exponent Encoder result output - ); - - // - // instantiate Temporary Register - oc54_treg cpu_treg( - .clk(clk_i), // clock input - .ena(ena_treg_i), // treg clock enable input - .we(1'b1), // treg write enable input - .seli(treg_sel_i), // treg select input - .exp(exp_result), // Exponent Encoder Result input - .d(db_i), // Data Bus input - .result(treg) // TREG - ); - - // - // instantiate accumulators - oc54_acc cpu_acc_a( - .clk(clk_i), // clock input - .ena(ena_acca_i), // accumulator A clock enable input - .seli(acca_sel_i), // accumulator A select input - .we(1'b1), // write enable input - .a(acc_a), // accumulator A input - .b(acc_b), // accumulator B input - .alu(alu_result), // ALU result input - .mac(mac_result), // MAC result input - .ovm(ovm_i), // overflow mode input - .rnd(rnd_i), // mac-rounding input - .zf(zf_a_o), // accumulator A zero flag output - .ovf(ovf_a_o), // accumulator A overflow flag output - .bp_result(bp_ar), // bypass accumulator A output - .result(acc_a) // accumulator A output - ); - - oc54_acc cpu_acc_b( - .clk(clk_i), // clock input - .ena(ena_accb_i), // accumulator B clock enable input - .seli(accb_sel_i), // accumulator B select input - .we(1'b1), // write enable input - .a(acc_a), // accumulator A input - .b(acc_b), // accumulator B input - .alu(alu_result), // ALU result input - .mac(mac_result), // MAC result input - .ovm(ovm_i), // overflow mode input - .rnd(rnd_i), // mac-rounding input - .zf(zf_b_o), // accumulator B zero flag output - .ovf(ovf_b_o), // accumulator B overflow flag output - .bp_result(bp_br), // bypass accumulator B output - .result(acc_b) // accumulator B output - ); -endmodule - Index: c54x/trunk/rtl/verilog/timescale.v =================================================================== --- c54x/trunk/rtl/verilog/timescale.v (revision 4) +++ c54x/trunk/rtl/verilog/timescale.v (nonexistent) @@ -1 +0,0 @@ -`timescale 1ns / 10ps \ No newline at end of file Index: c54x/trunk/rtl/verilog/oc54_exp.v =================================================================== --- c54x/trunk/rtl/verilog/oc54_exp.v (revision 4) +++ c54x/trunk/rtl/verilog/oc54_exp.v (nonexistent) @@ -1,300 +0,0 @@ -///////////////////////////////////////////////////////////////////// -//// //// -//// OpenCores54 DSP, Exponent Encoder //// -//// //// -//// Author: Richard Herveille //// -//// richard@asics.ws //// -//// www.asics.ws //// -//// //// -///////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2002 Richard Herveille //// -//// richard@asics.ws //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer.//// -//// //// -//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// -//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// -//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// -//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// -//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// -//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// -//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// -//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// -//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// -//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// -//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// -//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// -//// POSSIBILITY OF SUCH DAMAGE. //// -//// //// -///////////////////////////////////////////////////////////////////// - -// -// Xilinx Virtex-E WC: 116 CLB slices @ 74MHz, pass 4 -// - -// CVS Log -// -// $Id: oc54_exp.v,v 1.1.1.1 2002-04-10 09:34:41 rherveille Exp $ -// -// $Date: 2002-04-10 09:34:41 $ -// $Revision: 1.1.1.1 $ -// $Author: rherveille $ -// $Locker: $ -// $State: Exp $ -// -// Change History: -// $Log: not supported by cvs2svn $ - -`include "timescale.v" - -module oc54_exp ( - clk, ena, - sel_acc, - a, b, - bp_ar, bp_br, - bp_a, bp_b, - result - ); - -// -// parameters -// - -// -// inputs & outputs -// -input clk; -input ena; -input sel_acc; // select accumulator -input [39:0] a, b; // accumulator inputs -input [39:0] bp_ar, bp_br; // bypass accumulator a / b -input bp_a, bp_b; // bypass selects -output [ 5:0] result; - -reg [5:0] result; - -// -// variables -// -reg [39:0] acc; - -///////////////// -// module body // -///////////////// 34('1') - 1(sign bit) - 8 - -// -// generate input selection -// - -// input selection -always@(posedge clk) - if (ena) - if (sel_acc) - acc = bp_b ? bp_br : b; - else - acc = bp_a ? bp_ar : a; - -// -// Generate exponent encoder -// -// The result of the exponent encoder is the number of leading -// redundant bits, except the sign-bit, -8. Exp is in the -8 to +31 range. - -// 00_0110 -> 11_1001 -> 11_1010 - -always@(posedge clk) - if (ena) - casex (acc) // synopsis full_case parallel_case - // - // positive numbers - // - 40'b01??_????_????_????_????_????_????_????_????_????: - result <= #1 6'h38; // 1 (leading red. bit) - 1 (sign bit) - 8 = -8 - 40'b001?_????_????_????_????_????_????_????_????_????: - result <= #1 6'h39; // 2 (leading red. bit) - 1 (sign bit) - 8 = -7 - 40'b0001_????_????_????_????_????_????_????_????_????: - result <= #1 6'h3a; // 3 (leading red. bit) - 1 (sign bit) - 8 = -6 - 40'b0000_1???_????_????_????_????_????_????_????_????: - result <= #1 6'h3b; // 4 (leading red. bit) - 1 (sign bit) - 8 = -5 - - 40'b0000_01??_????_????_????_????_????_????_????_????: - result <= #1 6'h3c; // 5 (leading red. bit) - 1 (sign bit) - 8 = -4 - 40'b0000_001?_????_????_????_????_????_????_????_????: - result <= #1 6'h3d; // 6 (leading red. bit) - 1 (sign bit) - 8 = -3 - 40'b0000_0001_????_????_????_????_????_????_????_????: - result <= #1 6'h3e; // 7 (leading red. bit) - 1 (sign bit) - 8 = -2 - 40'b0000_0000_1???_????_????_????_????_????_????_????: - result <= #1 6'h3f; // 8 (leading red. bit) - 1 (sign bit) - 8 = -1 - - 40'b0000_0000_01??_????_????_????_????_????_????_????: - result <= #1 6'h00; // 9 (leading red. bit) - 1 (sign bit) - 8 = 0 - 40'b0000_0000_001?_????_????_????_????_????_????_????: - result <= #1 6'h01; //10 (leading red. bit) - 1 (sign bit) - 8 = 1 - 40'b0000_0000_0001_????_????_????_????_????_????_????: - result <= #1 6'h02; //11 (leading red. bit) - 1 (sign bit) - 8 = 2 - 40'b0000_0000_0000_1???_????_????_????_????_????_????: - result <= #1 6'h03; //12 (leading red. bit) - 1 (sign bit) - 8 = 3 - - 40'b0000_0000_0000_01??_????_????_????_????_????_????: - result <= #1 6'h04; //13 (leading red. bit) - 1 (sign bit) - 8 = 4 - 40'b0000_0000_0000_001?_????_????_????_????_????_????: - result <= #1 6'h05; //14 (leading red. bit) - 1 (sign bit) - 8 = 5 - 40'b0000_0000_0000_0001_????_????_????_????_????_????: - result <= #1 6'h06; //15 (leading red. bit) - 1 (sign bit) - 8 = 6 - 40'b0000_0000_0000_0000_1???_????_????_????_????_????: - result <= #1 6'h07; //16 (leading red. bit) - 1 (sign bit) - 8 = 7 - - 40'b0000_0000_0000_0000_01??_????_????_????_????_????: - result <= #1 6'h08; //17 (leading red. bit) - 1 (sign bit) - 8 = 8 - 40'b0000_0000_0000_0000_001?_????_????_????_????_????: - result <= #1 6'h09; //18 (leading red. bit) - 1 (sign bit) - 8 = 9 - 40'b0000_0000_0000_0000_0001_????_????_????_????_????: - result <= #1 6'h0a; //19 (leading red. bit) - 1 (sign bit) - 8 =10 - 40'b0000_0000_0000_0000_0000_1???_????_????_????_????: - result <= #1 6'h0b; //20 (leading red. bit) - 1 (sign bit) - 8 =11 - - 40'b0000_0000_0000_0000_0000_01??_????_????_????_????: - result <= #1 6'h0c; //21 (leading red. bit) - 1 (sign bit) - 8 =12 - 40'b0000_0000_0000_0000_0000_001?_????_????_????_????: - result <= #1 6'h0d; //22 (leading red. bit) - 1 (sign bit) - 8 =13 - 40'b0000_0000_0000_0000_0000_0001_????_????_????_????: - result <= #1 6'h0e; //23 (leading red. bit) - 1 (sign bit) - 8 =14 - 40'b0000_0000_0000_0000_0000_0000_1???_????_????_????: - result <= #1 6'h0f; //24 (leading red. bit) - 1 (sign bit) - 8 =15 - - 40'b0000_0000_0000_0000_0000_0000_01??_????_????_????: - result <= #1 6'h10; //25 (leading red. bit) - 1 (sign bit) - 8 =16 - 40'b0000_0000_0000_0000_0000_0000_001?_????_????_????: - result <= #1 6'h11; //26 (leading red. bit) - 1 (sign bit) - 8 =17 - 40'b0000_0000_0000_0000_0000_0000_0001_????_????_????: - result <= #1 6'h12; //27 (leading red. bit) - 1 (sign bit) - 8 =18 - 40'b0000_0000_0000_0000_0000_0000_0000_1???_????_????: - result <= #1 6'h13; //28 (leading red. bit) - 1 (sign bit) - 8 =19 - - 40'b0000_0000_0000_0000_0000_0000_0000_01??_????_????: - result <= #1 6'h14; //29 (leading red. bit) - 1 (sign bit) - 8 =20 - 40'b0000_0000_0000_0000_0000_0000_0000_001?_????_????: - result <= #1 6'h15; //30 (leading red. bit) - 1 (sign bit) - 8 =21 - 40'b0000_0000_0000_0000_0000_0000_0000_0001_????_????: - result <= #1 6'h16; //31 (leading red. bit) - 1 (sign bit) - 8 =22 - 40'b0000_0000_0000_0000_0000_0000_0000_0000_1???_????: - result <= #1 6'h17; //32 (leading red. bit) - 1 (sign bit) - 8 =23 - - 40'b0000_0000_0000_0000_0000_0000_0000_0000_01??_????: - result <= #1 6'h18; //33 (leading red. bit) - 1 (sign bit) - 8 =24 - 40'b0000_0000_0000_0000_0000_0000_0000_0000_001?_????: - result <= #1 6'h19; //34 (leading red. bit) - 1 (sign bit) - 8 =25 - 40'b0000_0000_0000_0000_0000_0000_0000_0000_0001_????: - result <= #1 6'h1a; //35 (leading red. bit) - 1 (sign bit) - 8 =26 - 40'b0000_0000_0000_0000_0000_0000_0000_0000_0000_1???: - result <= #1 6'h1b; //36 (leading red. bit) - 1 (sign bit) - 8 =27 - - 40'b0000_0000_0000_0000_0000_0000_0000_0000_0000_01??: - result <= #1 6'h1c; //37 (leading red. bit) - 1 (sign bit) - 8 =28 - 40'b0000_0000_0000_0000_0000_0000_0000_0000_0000_001?: - result <= #1 6'h1d; //38 (leading red. bit) - 1 (sign bit) - 8 =29 - 40'b0000_0000_0000_0000_0000_0000_0000_0000_0000_0001: - result <= #1 6'h1e; //39 (leading red. bit) - 1 (sign bit) - 8 =30 - 40'b0000_0000_0000_0000_0000_0000_0000_0000_0000_0000: - result <= #1 6'h1f; //40 (leading red. bit) - 1 (sign bit) - 8 =31 - - // - // negative numbers - // - 40'b10??_????_????_????_????_????_????_????_????_????: - result <= #1 6'h38; // 1 (leading red. bit) - 1 (sign bit) - 8 = -8 - 40'b110?_????_????_????_????_????_????_????_????_????: - result <= #1 6'h39; // 2 (leading red. bit) - 1 (sign bit) - 8 = -7 - 40'b1110_????_????_????_????_????_????_????_????_????: - result <= #1 6'h3a; // 3 (leading red. bit) - 1 (sign bit) - 8 = -6 - 40'b1111_0???_????_????_????_????_????_????_????_????: - result <= #1 6'h3b; // 4 (leading red. bit) - 1 (sign bit) - 8 = -5 - - 40'b1111_10??_????_????_????_????_????_????_????_????: - result <= #1 6'h3c; // 5 (leading red. bit) - 1 (sign bit) - 8 = -4 - 40'b1111_110?_????_????_????_????_????_????_????_????: - result <= #1 6'h3d; // 6 (leading red. bit) - 1 (sign bit) - 8 = -3 - 40'b1111_1110_????_????_????_????_????_????_????_????: - result <= #1 6'h3e; // 7 (leading red. bit) - 1 (sign bit) - 8 = -2 - 40'b1111_1111_0???_????_????_????_????_????_????_????: - result <= #1 6'h3f; // 8 (leading red. bit) - 1 (sign bit) - 8 = -1 - - 40'b1111_1111_10??_????_????_????_????_????_????_????: - result <= #1 6'h00; // 9 (leading red. bit) - 1 (sign bit) - 8 = 0 - 40'b1111_1111_110?_????_????_????_????_????_????_????: - result <= #1 6'h01; //10 (leading red. bit) - 1 (sign bit) - 8 = 1 - 40'b1111_1111_1110_????_????_????_????_????_????_????: - result <= #1 6'h02; //11 (leading red. bit) - 1 (sign bit) - 8 = 2 - 40'b1111_1111_1111_0???_????_????_????_????_????_????: - result <= #1 6'h03; //12 (leading red. bit) - 1 (sign bit) - 8 = 3 - - 40'b1111_1111_1111_10??_????_????_????_????_????_????: - result <= #1 6'h04; //13 (leading red. bit) - 1 (sign bit) - 8 = 4 - 40'b1111_1111_1111_110?_????_????_????_????_????_????: - result <= #1 6'h05; //14 (leading red. bit) - 1 (sign bit) - 8 = 5 - 40'b1111_1111_1111_1110_????_????_????_????_????_????: - result <= #1 6'h06; //15 (leading red. bit) - 1 (sign bit) - 8 = 6 - 40'b1111_1111_1111_1111_0???_????_????_????_????_????: - result <= #1 6'h07; //16 (leading red. bit) - 1 (sign bit) - 8 = 7 - - 40'b1111_1111_1111_1111_10??_????_????_????_????_????: - result <= #1 6'h08; //17 (leading red. bit) - 1 (sign bit) - 8 = 8 - 40'b1111_1111_1111_1111_110?_????_????_????_????_????: - result <= #1 6'h09; //18 (leading red. bit) - 1 (sign bit) - 8 = 9 - 40'b1111_1111_1111_1111_1110_????_????_????_????_????: - result <= #1 6'h0a; //19 (leading red. bit) - 1 (sign bit) - 8 =10 - 40'b1111_1111_1111_1111_1111_0???_????_????_????_????: - result <= #1 6'h0b; //20 (leading red. bit) - 1 (sign bit) - 8 =11 - - 40'b1111_1111_1111_1111_1111_10??_????_????_????_????: - result <= #1 6'h0c; //21 (leading red. bit) - 1 (sign bit) - 8 =12 - 40'b1111_1111_1111_1111_1111_110?_????_????_????_????: - result <= #1 6'h0d; //22 (leading red. bit) - 1 (sign bit) - 8 =13 - 40'b1111_1111_1111_1111_1111_1110_????_????_????_????: - result <= #1 6'h0e; //23 (leading red. bit) - 1 (sign bit) - 8 =14 - 40'b1111_1111_1111_1111_1111_1111_0???_????_????_????: - result <= #1 6'h0f; //24 (leading red. bit) - 1 (sign bit) - 8 =15 - - 40'b1111_1111_1111_1111_1111_1111_10??_????_????_????: - result <= #1 6'h10; //25 (leading red. bit) - 1 (sign bit) - 8 =16 - 40'b1111_1111_1111_1111_1111_1111_110?_????_????_????: - result <= #1 6'h11; //26 (leading red. bit) - 1 (sign bit) - 8 =17 - 40'b1111_1111_1111_1111_1111_1111_1110_????_????_????: - result <= #1 6'h12; //27 (leading red. bit) - 1 (sign bit) - 8 =18 - 40'b1111_1111_1111_1111_1111_1111_1111_0???_????_????: - result <= #1 6'h13; //28 (leading red. bit) - 1 (sign bit) - 8 =19 - - 40'b1111_1111_1111_1111_1111_1111_1111_10??_????_????: - result <= #1 6'h14; //29 (leading red. bit) - 1 (sign bit) - 8 =20 - 40'b1111_1111_1111_1111_1111_1111_1111_110?_????_????: - result <= #1 6'h15; //30 (leading red. bit) - 1 (sign bit) - 8 =21 - 40'b1111_1111_1111_1111_1111_1111_1111_1110_????_????: - result <= #1 6'h16; //31 (leading red. bit) - 1 (sign bit) - 8 =22 - 40'b1111_1111_1111_1111_1111_1111_1111_1111_0???_????: - result <= #1 6'h17; //32 (leading red. bit) - 1 (sign bit) - 8 =23 - - 40'b1111_1111_1111_1111_1111_1111_1111_1111_10??_????: - result <= #1 6'h18; //33 (leading red. bit) - 1 (sign bit) - 8 =24 - 40'b1111_1111_1111_1111_1111_1111_1111_1111_110?_????: - result <= #1 6'h19; //34 (leading red. bit) - 1 (sign bit) - 8 =25 - 40'b1111_1111_1111_1111_1111_1111_1111_1111_1110_????: - result <= #1 6'h1a; //35 (leading red. bit) - 1 (sign bit) - 8 =26 - 40'b1111_1111_1111_1111_1111_1111_1111_1111_1111_0???: - result <= #1 6'h1b; //36 (leading red. bit) - 1 (sign bit) - 8 =27 - - 40'b1111_1111_1111_1111_1111_1111_1111_1111_1111_10??: - result <= #1 6'h1c; //37 (leading red. bit) - 1 (sign bit) - 8 =28 - 40'b1111_1111_1111_1111_1111_1111_1111_1111_1111_110?: - result <= #1 6'h1d; //38 (leading red. bit) - 1 (sign bit) - 8 =29 - 40'b1111_1111_1111_1111_1111_1111_1111_1111_1111_1110: - result <= #1 6'h1e; //39 (leading red. bit) - 1 (sign bit) - 8 =30 - 40'b1111_1111_1111_1111_1111_1111_1111_1111_1111_1111: - result <= #1 6'h1f; //40 (leading red. bit) - 1 (sign bit) - 8 =31 - endcase - -endmodule - Index: c54x/trunk/rtl/verilog/oc54_cssu.v =================================================================== --- c54x/trunk/rtl/verilog/oc54_cssu.v (revision 4) +++ c54x/trunk/rtl/verilog/oc54_cssu.v (nonexistent) @@ -1,122 +0,0 @@ -///////////////////////////////////////////////////////////////////// -//// //// -//// OpenCores54 DSP, Compare Select and Store Unit (CSSU) //// -//// //// -//// Author: Richard Herveille //// -//// richard@asics.ws //// -//// www.asics.ws //// -//// //// -///////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2002 Richard Herveille //// -//// richard@asics.ws //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer.//// -//// //// -//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// -//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// -//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// -//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// -//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// -//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// -//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// -//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// -//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// -//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// -//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// -//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// -//// POSSIBILITY OF SUCH DAMAGE. //// -//// //// -///////////////////////////////////////////////////////////////////// - -// -// NOTE: Read the pipeline information for the CMPS instruction -// - -// -// Xilinx Virtex-E WC: 41 CLB slices @ 130MHz -// - -// CVS Log -// -// $Id: oc54_cssu.v,v 1.1.1.1 2002-04-10 09:34:41 rherveille Exp $ -// -// $Date: 2002-04-10 09:34:41 $ -// $Revision: 1.1.1.1 $ -// $Author: rherveille $ -// $Locker: $ -// $State: Exp $ -// -// Change History: -// $Log: not supported by cvs2svn $ - -`include "timescale.v" - -module oc54_cssu ( - clk, ena, - sel_acc, is_cssu, - a, b, s, - tco, - trn, result - ); - -// -// parameters -// - -// -// inputs & outputs -// -input clk; -input ena; -input sel_acc; // select input -input is_cssu; // is this a cssu operation ? -input [39:0] a, b, s; // accumulators, shifter input -output tco; // tc-out -output [15:0] trn, result; - -reg tco; -reg [15:0] trn, result; - -// -// variables -// - -wire [31:0] acc; // selected accumulator -wire acc_cmp; // acc[31;16]>acc[15:0] ?? -// -// module body -// - -// -// generate input selection -// - -// input selection -assign acc = sel_acc ? b[31:0] : a[31:0]; - -assign acc_cmp = acc[31:16] > acc[15:0]; - -// result -always@(posedge clk) - if (ena) - begin - if (is_cssu) - if (acc_cmp) - result <= #1 acc[31:16]; - else - result <= #1 acc[15:0]; - else - result <= #1 s[15:0]; - - if (is_cssu) - trn <= #1 {trn[14:0], ~acc_cmp}; - - tco <= #1 ~acc_cmp; - end -endmodule - - Index: c54x/trunk/rtl/verilog/oc54_alu_defines.v =================================================================== --- c54x/trunk/rtl/verilog/oc54_alu_defines.v (revision 4) +++ c54x/trunk/rtl/verilog/oc54_alu_defines.v (nonexistent) @@ -1,113 +0,0 @@ -///////////////////////////////////////////////////////////////////// -//// //// -//// OpenCores54 DSP, ALU defines //// -//// //// -//// Author: Richard Herveille //// -//// richard@asics.ws //// -//// www.asics.ws //// -//// //// -///////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2002 Richard Herveille //// -//// richard@asics.ws //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer.//// -//// //// -//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// -//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// -//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// -//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// -//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// -//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// -//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// -//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// -//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// -//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// -//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// -//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// -//// POSSIBILITY OF SUCH DAMAGE. //// -//// //// -///////////////////////////////////////////////////////////////////// - -// CVS Log -// -// $Id: oc54_alu_defines.v,v 1.1.1.1 2002-04-10 09:34:40 rherveille Exp $ -// -// $Date: 2002-04-10 09:34:40 $ -// $Revision: 1.1.1.1 $ -// $Author: rherveille $ -// $Locker: $ -// $State: Exp $ -// -// Change History: -// $Log: not supported by cvs2svn $ - - -// -// Encoding: bit[6] always zero -// bit[5:4] instuction type -// - 00: (dual) arithmetic -// - 01: logical (incl. shift) -// - 10: bit-test & compare -// - 11: reserved -// Leonardo-Spectrum seems to like the additional zero bit[6] in -// the encoding scheme. It produces the smallest and fastest code -// like this. (Why ???) -// - -// -// arithmetic instructions -// -`define ABS 7'b000_0000 -`define NEG 7'b000_0001 -`define ADD 7'b000_0010 -`define SUB 7'b000_0011 -`define MAX 7'b000_0100 -`define SUBC 7'b000_0101 - -// -// dual arithmetic instructions -// -`define DADD 7'b000_1000 -`define DSUB 7'b000_1100 -`define DRSUB 7'b000_1101 -`define DSUBADD 7'b000_1110 -`define DADDSUB 7'b000_1001 - -// -// logical instructions -// -`define NOT 7'b001_0000 -`define AND 7'b001_0001 -`define OR 7'b001_0010 -`define XOR 7'b001_0011 - -// -// shift instructions -// -`define ROL 7'b001_0100 -`define ROLTC 7'b001_0101 -`define ROR 7'b001_0110 -`define SHFT_CMP 7'b001_0111 - -// -// bit test instructions -// -`define BITF 7'b010_0000 -`define BTST 7'b010_0001 -`define CMP_EQ 7'b010_0100 -`define CMP_LT 7'b010_0101 -`define CMP_GT 7'b010_0110 -`define CMP_NEQ 7'b010_0111 - -// -// condition codes for CMP-test -// -`define EQ 2'b00 -`define LT 2'b01 -`define GT 2'b10 -`define NEQ 2'b11 - Index: c54x/trunk/rtl/verilog/oc54_mac.v =================================================================== --- c54x/trunk/rtl/verilog/oc54_mac.v (revision 4) +++ c54x/trunk/rtl/verilog/oc54_mac.v (nonexistent) @@ -1,164 +0,0 @@ -///////////////////////////////////////////////////////////////////// -//// //// -//// OpenCores54 DSP, MAC //// -//// //// -//// Author: Richard Herveille //// -//// richard@asics.ws //// -//// www.asics.ws //// -//// //// -///////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2002 Richard Herveille //// -//// richard@asics.ws //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer.//// -//// //// -//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// -//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// -//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// -//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// -//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// -//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// -//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// -//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// -//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// -//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// -//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// -//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// -//// POSSIBILITY OF SUCH DAMAGE. //// -//// //// -///////////////////////////////////////////////////////////////////// - -// -// Xilinx Virtex-E WC: 296 CLB slices @ 64MHz -// - -// CVS Log -// -// $Id: oc54_mac.v,v 1.1.1.1 2002-04-10 09:34:41 rherveille Exp $ -// -// $Date: 2002-04-10 09:34:41 $ -// $Revision: 1.1.1.1 $ -// $Author: rherveille $ -// $Locker: $ -// $State: Exp $ -// -// Change History: -// $Log: not supported by cvs2svn $ - -`include "timescale.v" - -module oc54_mac ( - clk, ena, - a, b, t, p, c, d, - sel_xm, sel_ym, sel_ya, - bp_a, bp_b, bp_ar, bp_br, - xm_s, ym_s, - ovm, frct, smul, add_sub, - result - ); - -// -// parameters -// - -// -// inputs & outputs -// -input clk; -input ena; -input [15:0] t, p, c, d; // TREG, p-bus, c-bus, d-bus inputs -input [39:0] a, b; // accumulator inputs -input [ 1:0] sel_xm, sel_ym, sel_ya; // input selects -input [39:0] bp_ar, bp_br; // bypass accumulator a / b -input bp_a, bp_b; // bypass selects -input xm_s, ym_s; // sign extend xm, ym -input ovm, frct, smul, add_sub; -output [39:0] result; - -reg [39:0] result; - -// -// variables -// -reg [16:0] xm, ym; // multiplier inputs -reg [39:0] ya; // adder Y-input - -reg [33:0] mult_res; // multiplier result -wire [33:0] imult_res; // actual multiplier -reg [39:0] iresult; // mac-result - -///////////////// -// module body // -///////////////// - -// -// generate input selection -// - -// xm -always@(posedge clk) - if (ena) - case(sel_xm) // synopsis full_case parallel_case - 2'b00 : xm <= #1 {xm_s ? t[15] : 1'b0, t}; - 2'b01 : xm <= #1 {xm_s ? d[15] : 1'b0, d}; - 2'b10 : xm <= #1 bp_a ? bp_ar[32:16] : a[32:16]; - 2'b11 : xm <= #1 17'h0; - endcase - -// ym -always@(posedge clk) - if (ena) - case(sel_ym) // synopsis full_case parallel_case - 2'b00 : ym <= #1 {ym_s ? p[15] : 1'b0, p}; - 2'b01 : ym <= #1 bp_a ? bp_ar[32:16] : a[32:16]; - 2'b10 : ym <= #1 {ym_s ? d[15] : 1'b0, d}; - 2'b11 : ym <= #1 {ym_s ? c[15] : 1'b0, c}; - endcase - -// ya -always@(posedge clk) - if (ena) - casex(sel_ya) // synopsis full_case parallel_case - 2'b00 : ya <= #1 bp_a ? bp_ar : a; - 2'b01 : ya <= #1 bp_b ? bp_br : b; - 2'b1? : ya <= #1 40'h0; - endcase - -// -// generate multiplier -// -assign imult_res = (xm * ym); // actual multiplier - -always@(xm or ym or smul or ovm or frct or imult_res) - if (smul && ovm && frct && (xm[15:0] == 16'h8000) && (ym[15:0] == 16'h8000) ) - mult_res = 34'h7ff_ffff; - else if (frct) - mult_res = {imult_res[32:0], 1'b0}; // (imult_res << 1) - else - mult_res = imult_res; - -// -// generate mac-unit -// -always@(mult_res or ya or add_sub) - if (add_sub) - iresult = mult_res + ya; - else - iresult = mult_res - ya; - -// -// generate registers -// - -// result -always@(posedge clk) - if (ena) - result <= #1 iresult; - -endmodule - - Index: c54x/trunk/rtl/verilog/oc54_alu.v =================================================================== --- c54x/trunk/rtl/verilog/oc54_alu.v (revision 4) +++ c54x/trunk/rtl/verilog/oc54_alu.v (nonexistent) @@ -1,362 +0,0 @@ -///////////////////////////////////////////////////////////////////// -//// //// -//// OpenCores54 DSP, ALU //// -//// //// -//// Author: Richard Herveille //// -//// richard@asics.ws //// -//// www.asics.ws //// -//// //// -///////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2002 Richard Herveille //// -//// richard@asics.ws //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer.//// -//// //// -//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// -//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// -//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// -//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// -//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// -//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// -//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// -//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// -//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// -//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// -//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// -//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// -//// POSSIBILITY OF SUCH DAMAGE. //// -//// //// -///////////////////////////////////////////////////////////////////// - -// -// Xilinx Virtex-E WC: 617 CLB slices @ 58MHz -// - -// CVS Log -// -// $Id: oc54_alu.v,v 1.1.1.1 2002-04-10 09:34:40 rherveille Exp $ -// -// $Date: 2002-04-10 09:34:40 $ -// $Revision: 1.1.1.1 $ -// $Author: rherveille $ -// $Locker: $ -// $State: Exp $ -// -// Change History: -// $Log: not supported by cvs2svn $ - -`include "timescale.v" -`include "oc54_alu_defines.v" - -module oc54_alu ( - clk, ena, inst, - seli, doublet, - a, b, s, t, cb, - bp_a, bp_b, bp_ar, bp_br, - c16, sxm, ci, tci, - co, tco, - result - ); - -// -// parameters -// - -// -// inputs & outputs -// -input clk; -input ena; -input [ 6:0] inst; // instruction -input [ 1:0] seli; // input selection -input doublet; // {T, T} -input [39:0] a, b, s; // accumulators + shifter inputs -input [15:0] t, cb; // TREG + c-bus input -input [39:0] bp_ar, bp_br; // bypass a register, bypass b register -input bp_a, bp_b; // bypass select -input c16, sxm; // dual-mode, sign-extend-mode, -input ci, tci; // carry in, tc-in -output co, tco; // carry out, overflow, zero, tc-out -output [39:0] result; - -reg co, tco; -reg [39:0] result; - -// -// variables -// -reg [39:0] iresult; -reg itco, ico; -reg [39:0] x; - -wire [39:0] y; - -reg dc16, dci, dtci; - -reg [6:0] dinst; - - -// -// module body -// - -// -// generate input selection, barrel-shifter has 1cycle delay -// -always@(posedge clk) - if (ena) - case(seli) // synopsis full_case parallel_case - 2'b00 : - if (doublet) - x <= #1 { {39-31{1'b0}}, t, t}; // is this correct ?? - else - x <= #1 { {39-15{sxm ? t[15] : 1'b0}}, t}; - 2'b01 : x <= #1 bp_a ? bp_ar : a; - 2'b10 : x <= #1 bp_b ? bp_br : b; - 2'b11 : x <= #1 { {39-15{sxm ? cb[15] : 1'b0}}, cb}; - endcase - -assign y = s; // second input from barrel-shifter - -// -// delay control signals -// -always@(posedge clk) - if (ena) - begin - dc16 <= #1 c16; - dci <= #1 ci; - dtci <= #1 tci; - dinst <= #1 inst; - end - -// -// generate ALU -// -always@(dinst or x or y or dc16 or dtci or dci) -begin - - ico = dci; - itco = dtci; - iresult = x; - - case(dinst) // synopsis full_case parallel_case - // - // Arithmetic instructions - // - `ABS : // absolute value - begin - if (x[39]) - iresult = (~x) + 1'b1; - else - iresult = x; - - ico = ~|(iresult); - end - - `ADD : // ALSO ADDC, ADDS. For ADD, ADDS ci = 1'b0; - begin - iresult = x + y + dci; - ico = iresult[32]; - end - - `MAX : // ALSO MIN. MAX: x==accA, y==accB, MIN: x==accB, y ==accA - begin - ico = (x > y); - iresult = (x > y) ? x : y; - end - - `NEG : - begin - iresult = (~x) + 1'b1; - ico = ~|(iresult); - end - - `SUB : // ALSO SUBB, SUBS. For SUB, SUBS ci = 1'b1; - begin - iresult = x - y - ~dci; - ico = iresult[32]; - end - - `SUBC : // subtract conditional (for division) - begin - // FIXME: Is this correct ?? How does SUBC affect the carry bit ? - iresult = x - y; - ico = iresult[32]; - - if ( iresult > 0 ) -// iresult = (iresult << 1) + 1'b1; - iresult = ({x[38:0], 1'b0}) + 1'b1; - else -// iresult = x << 1; - iresult = {x[38:0], 1'b0}; - end - - - // - // Dual Precision Arithmetic instructions - // - `DADD : - if (dc16) // dual add result_hi/lo = x_hi/lo + y_hi/lo - begin - iresult[39:16] = x[31:16] + y[31:16]; - iresult[15: 0] = x[15: 0] + y[15: 0]; - end - else // 32bit add result = x + y - {ico, iresult} = x + y; - - `DSUB : - if (dc16) // dual subtract result_hi/lo = x_hi/lo - y_hi/lo - begin - iresult[39:16] = x[31:16] - y[31:16]; - iresult[15: 0] = x[15: 0] - y[15: 0]; - end - else // 32bit subtract result = x - y - begin - iresult = x - y; - ico = iresult[32]; - end - - `DRSUB : // ALSO DSUBT: make sure x = {T, T} - if (dc16) // dual reverse sub. result_hi/lo = y_hi/lo - x_hi/lo - begin - iresult[39:16] = y[31:16] - x[31:16]; - iresult[15: 0] = y[15: 0] - x[15: 0]; - end - else // 32bit reverse sub.result = y - x - begin - iresult = y - x; - ico = iresult[32]; - end - - `DSUBADD : // DSADT: make sure x = {T, T} - if (dc16) - begin - iresult[39:16] = y[31:16] - x[31:16]; - iresult[15: 0] = y[15: 0] + x[15: 0]; - end - else - begin - iresult = y - x; - ico = iresult[32]; - end - - `DADDSUB : // DADST: make sure x = {T, T} - if (dc16) - begin - iresult[39:16] = y[31:16] + x[31:16]; - iresult[15: 0] = y[15: 0] - x[15: 0]; - end - else - begin - iresult = x + y; - ico = iresult[32]; - end - - // - // logical instructions - // - `NOT : // CMPL - iresult = ~x; - - `AND : - iresult = x & y; - - `OR : - iresult = x | y; - - `XOR : - iresult = x ^ y; - - // - // shift instructions - // - `ROL : - begin - iresult[39:32] = 8'h0; - iresult[31: 0] = {x[30:0], dci}; - ico = x[31]; - end - - `ROLTC : - begin - iresult[39:32] = 8'h0; - iresult[31: 0] = {x[30:0], dtci}; - ico = x[31]; - end - - `ROR : - begin - iresult[39:32] = 8'h0; - iresult[31: 0] = {dci, x[31:1]}; - ico = x[0]; - end - - `SHFT_CMP : - if (x[31] & x[30]) - begin -// iresult = x << 1; - iresult = {x[38:0], 1'b0}; - itco = 1'b0; - end - else - begin - iresult = x; - itco = 1'b1; - end - - // - // bit test and compare instructions - // - `BITF : - itco = ~|( x[15:0] & y[15:0] ); - - `BTST : // BIT, BITT y=Smem, x=imm or T - itco = y[ ~x[3:0] ]; // maybe do ~x at a higher level ?? - - `CMP_EQ : // ALSO CMPM. for CMPM [39:16]==0 - itco = ~|(x ^ y); - `CMP_LT : - itco = x < y; - `CMP_GT : - itco = x > y; - `CMP_NEQ : - itco = |(x ^ y); - - // - // NOP - // - default : - begin - ico = dci; - itco = dtci; - iresult = x; - end - endcase -end - - -// -// generate registers -// - -// result -always@(posedge clk) - if (ena) - result <= #1 iresult; - -// tco, co -always@(posedge clk) - if (ena) - begin - tco <= #1 itco; - co <= #1 ico; - end - -endmodule - - Index: c54x/trunk/rtl/verilog/oc54_treg.v =================================================================== --- c54x/trunk/rtl/verilog/oc54_treg.v (revision 4) +++ c54x/trunk/rtl/verilog/oc54_treg.v (nonexistent) @@ -1,99 +0,0 @@ -///////////////////////////////////////////////////////////////////// -//// //// -//// OpenCores54 DSP, Temporary Register (TREG) //// -//// //// -//// Author: Richard Herveille //// -//// richard@asics.ws //// -//// www.asics.ws //// -//// //// -///////////////////////////////////////////////////////////////////// -//// //// -//// Copyright (C) 2002 Richard Herveille //// -//// richard@asics.ws //// -//// //// -//// This source file may be used and distributed without //// -//// restriction provided that this copyright statement is not //// -//// removed from the file and that any derivative work contains //// -//// the original copyright notice and the associated disclaimer.//// -//// //// -//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// -//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// -//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// -//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// -//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// -//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// -//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// -//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// -//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// -//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// -//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// -//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// -//// POSSIBILITY OF SUCH DAMAGE. //// -//// //// -///////////////////////////////////////////////////////////////////// - -// -// NOTE: Read the pipeline information for the CMPS instruction -// - -// -// Xilinx Virtex-E WC: 41 CLB slices @ 130MHz -// - -// CVS Log -// -// $Id: oc54_treg.v,v 1.1.1.1 2002-04-10 09:34:41 rherveille Exp $ -// -// $Date: 2002-04-10 09:34:41 $ -// $Revision: 1.1.1.1 $ -// $Author: rherveille $ -// $Locker: $ -// $State: Exp $ -// -// Change History: -// $Log: not supported by cvs2svn $ - -`include "timescale.v" - -module oc54_treg ( - clk, ena, - seli, we, - exp, d, - result - ); - -// -// parameters -// - -// -// inputs & outputs -// -input clk; -input ena; -input seli; // select input -input we; // store result -input [ 5:0] exp; // exponent encoder input -input [15:0] d; // DB input -output [15:0] result; - -reg [15:0] result; - -// -// variables -// - -// -// module body -// - -// -// generate input selection -// - -// result -always@(posedge clk) - if (ena) - if (we) - result <= #1 seli ? {10'h0, exp} : d; -endmodule Index: c54x/trunk =================================================================== --- c54x/trunk (revision 4) +++ c54x/trunk (nonexistent)
c54x/trunk Property changes : Deleted: svn:mergeinfo ## -0,0 +0,0 ## Index: c54x/branches =================================================================== --- c54x/branches (revision 4) +++ c54x/branches (nonexistent)
c54x/branches Property changes : Deleted: svn:mergeinfo ## -0,0 +0,0 ## Index: oc54x/trunk/rtl/verilog/oc54_alu.v =================================================================== --- oc54x/trunk/rtl/verilog/oc54_alu.v (nonexistent) +++ oc54x/trunk/rtl/verilog/oc54_alu.v (revision 5) @@ -0,0 +1,362 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, ALU //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// +// Xilinx Virtex-E WC: 617 CLB slices @ 58MHz +// + +// CVS Log +// +// $Id: oc54_alu.v,v 1.1.1.1 2002-04-10 09:34:40 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:40 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + +`include "timescale.v" +`include "oc54_alu_defines.v" + +module oc54_alu ( + clk, ena, inst, + seli, doublet, + a, b, s, t, cb, + bp_a, bp_b, bp_ar, bp_br, + c16, sxm, ci, tci, + co, tco, + result + ); + +// +// parameters +// + +// +// inputs & outputs +// +input clk; +input ena; +input [ 6:0] inst; // instruction +input [ 1:0] seli; // input selection +input doublet; // {T, T} +input [39:0] a, b, s; // accumulators + shifter inputs +input [15:0] t, cb; // TREG + c-bus input +input [39:0] bp_ar, bp_br; // bypass a register, bypass b register +input bp_a, bp_b; // bypass select +input c16, sxm; // dual-mode, sign-extend-mode, +input ci, tci; // carry in, tc-in +output co, tco; // carry out, overflow, zero, tc-out +output [39:0] result; + +reg co, tco; +reg [39:0] result; + +// +// variables +// +reg [39:0] iresult; +reg itco, ico; +reg [39:0] x; + +wire [39:0] y; + +reg dc16, dci, dtci; + +reg [6:0] dinst; + + +// +// module body +// + +// +// generate input selection, barrel-shifter has 1cycle delay +// +always@(posedge clk) + if (ena) + case(seli) // synopsis full_case parallel_case + 2'b00 : + if (doublet) + x <= #1 { {39-31{1'b0}}, t, t}; // is this correct ?? + else + x <= #1 { {39-15{sxm ? t[15] : 1'b0}}, t}; + 2'b01 : x <= #1 bp_a ? bp_ar : a; + 2'b10 : x <= #1 bp_b ? bp_br : b; + 2'b11 : x <= #1 { {39-15{sxm ? cb[15] : 1'b0}}, cb}; + endcase + +assign y = s; // second input from barrel-shifter + +// +// delay control signals +// +always@(posedge clk) + if (ena) + begin + dc16 <= #1 c16; + dci <= #1 ci; + dtci <= #1 tci; + dinst <= #1 inst; + end + +// +// generate ALU +// +always@(dinst or x or y or dc16 or dtci or dci) +begin + + ico = dci; + itco = dtci; + iresult = x; + + case(dinst) // synopsis full_case parallel_case + // + // Arithmetic instructions + // + `ABS : // absolute value + begin + if (x[39]) + iresult = (~x) + 1'b1; + else + iresult = x; + + ico = ~|(iresult); + end + + `ADD : // ALSO ADDC, ADDS. For ADD, ADDS ci = 1'b0; + begin + iresult = x + y + dci; + ico = iresult[32]; + end + + `MAX : // ALSO MIN. MAX: x==accA, y==accB, MIN: x==accB, y ==accA + begin + ico = (x > y); + iresult = (x > y) ? x : y; + end + + `NEG : + begin + iresult = (~x) + 1'b1; + ico = ~|(iresult); + end + + `SUB : // ALSO SUBB, SUBS. For SUB, SUBS ci = 1'b1; + begin + iresult = x - y - ~dci; + ico = iresult[32]; + end + + `SUBC : // subtract conditional (for division) + begin + // FIXME: Is this correct ?? How does SUBC affect the carry bit ? + iresult = x - y; + ico = iresult[32]; + + if ( iresult > 0 ) +// iresult = (iresult << 1) + 1'b1; + iresult = ({x[38:0], 1'b0}) + 1'b1; + else +// iresult = x << 1; + iresult = {x[38:0], 1'b0}; + end + + + // + // Dual Precision Arithmetic instructions + // + `DADD : + if (dc16) // dual add result_hi/lo = x_hi/lo + y_hi/lo + begin + iresult[39:16] = x[31:16] + y[31:16]; + iresult[15: 0] = x[15: 0] + y[15: 0]; + end + else // 32bit add result = x + y + {ico, iresult} = x + y; + + `DSUB : + if (dc16) // dual subtract result_hi/lo = x_hi/lo - y_hi/lo + begin + iresult[39:16] = x[31:16] - y[31:16]; + iresult[15: 0] = x[15: 0] - y[15: 0]; + end + else // 32bit subtract result = x - y + begin + iresult = x - y; + ico = iresult[32]; + end + + `DRSUB : // ALSO DSUBT: make sure x = {T, T} + if (dc16) // dual reverse sub. result_hi/lo = y_hi/lo - x_hi/lo + begin + iresult[39:16] = y[31:16] - x[31:16]; + iresult[15: 0] = y[15: 0] - x[15: 0]; + end + else // 32bit reverse sub.result = y - x + begin + iresult = y - x; + ico = iresult[32]; + end + + `DSUBADD : // DSADT: make sure x = {T, T} + if (dc16) + begin + iresult[39:16] = y[31:16] - x[31:16]; + iresult[15: 0] = y[15: 0] + x[15: 0]; + end + else + begin + iresult = y - x; + ico = iresult[32]; + end + + `DADDSUB : // DADST: make sure x = {T, T} + if (dc16) + begin + iresult[39:16] = y[31:16] + x[31:16]; + iresult[15: 0] = y[15: 0] - x[15: 0]; + end + else + begin + iresult = x + y; + ico = iresult[32]; + end + + // + // logical instructions + // + `NOT : // CMPL + iresult = ~x; + + `AND : + iresult = x & y; + + `OR : + iresult = x | y; + + `XOR : + iresult = x ^ y; + + // + // shift instructions + // + `ROL : + begin + iresult[39:32] = 8'h0; + iresult[31: 0] = {x[30:0], dci}; + ico = x[31]; + end + + `ROLTC : + begin + iresult[39:32] = 8'h0; + iresult[31: 0] = {x[30:0], dtci}; + ico = x[31]; + end + + `ROR : + begin + iresult[39:32] = 8'h0; + iresult[31: 0] = {dci, x[31:1]}; + ico = x[0]; + end + + `SHFT_CMP : + if (x[31] & x[30]) + begin +// iresult = x << 1; + iresult = {x[38:0], 1'b0}; + itco = 1'b0; + end + else + begin + iresult = x; + itco = 1'b1; + end + + // + // bit test and compare instructions + // + `BITF : + itco = ~|( x[15:0] & y[15:0] ); + + `BTST : // BIT, BITT y=Smem, x=imm or T + itco = y[ ~x[3:0] ]; // maybe do ~x at a higher level ?? + + `CMP_EQ : // ALSO CMPM. for CMPM [39:16]==0 + itco = ~|(x ^ y); + `CMP_LT : + itco = x < y; + `CMP_GT : + itco = x > y; + `CMP_NEQ : + itco = |(x ^ y); + + // + // NOP + // + default : + begin + ico = dci; + itco = dtci; + iresult = x; + end + endcase +end + + +// +// generate registers +// + +// result +always@(posedge clk) + if (ena) + result <= #1 iresult; + +// tco, co +always@(posedge clk) + if (ena) + begin + tco <= #1 itco; + co <= #1 ico; + end + +endmodule + + Index: oc54x/trunk/rtl/verilog/oc54_treg.v =================================================================== --- oc54x/trunk/rtl/verilog/oc54_treg.v (nonexistent) +++ oc54x/trunk/rtl/verilog/oc54_treg.v (revision 5) @@ -0,0 +1,99 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, Temporary Register (TREG) //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// +// NOTE: Read the pipeline information for the CMPS instruction +// + +// +// Xilinx Virtex-E WC: 41 CLB slices @ 130MHz +// + +// CVS Log +// +// $Id: oc54_treg.v,v 1.1.1.1 2002-04-10 09:34:41 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:41 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + +`include "timescale.v" + +module oc54_treg ( + clk, ena, + seli, we, + exp, d, + result + ); + +// +// parameters +// + +// +// inputs & outputs +// +input clk; +input ena; +input seli; // select input +input we; // store result +input [ 5:0] exp; // exponent encoder input +input [15:0] d; // DB input +output [15:0] result; + +reg [15:0] result; + +// +// variables +// + +// +// module body +// + +// +// generate input selection +// + +// result +always@(posedge clk) + if (ena) + if (we) + result <= #1 seli ? {10'h0, exp} : d; +endmodule Index: oc54x/trunk/rtl/verilog/oc54_acc.v =================================================================== --- oc54x/trunk/rtl/verilog/oc54_acc.v (nonexistent) +++ oc54x/trunk/rtl/verilog/oc54_acc.v (revision 5) @@ -0,0 +1,143 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, accumulator //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// +// Xilinx Virtex-E WC: 96 CLB slices @ 51MHz +// + +// CVS Log +// +// $Id: oc54_acc.v,v 1.1.1.1 2002-04-10 09:34:39 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:39 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + +`include "timescale.v" + +module oc54_acc ( + clk, ena, + seli, we, + a, b, alu, mac, + ovm, rnd, + zf, ovf, + result, bp_result + ); + +// +// parameters +// + +// +// inputs & outputs +// +input clk; +input ena; +input [ 1:0] seli; // select input +input we; // write enable +input [39:0] a, b, alu, mac; // accumulators, alu, mac input +input ovm, rnd; // overflow mode, saturate, round +output ovf, zf; // carry out, overflow, zero, tc-out +output [39:0] result; // accumulator register output +output [39:0] bp_result; // accumulator register bypass output + +reg ovf, zf; +reg [39:0] result; + +// +// variables +// +reg [39: 0] sel_r, iresult; // select results, final result +wire iovf; + +// +// module body +// + +// +// generate input selection +// + +// input selection & MAC-rounding +always@(seli or a or b or alu or mac or rnd) + case(seli) // synopsis full_case parallel_case + 2'b00: sel_r = a; + 2'b01: sel_r = b; + 2'b10: sel_r = alu; + 2'b11: sel_r = rnd ? (mac + 16'h8000) & 40'hff_ffff_0000 : mac; + endcase + +// overflow detection +// no overflow when: +// 1) all guard bits are set (valid negative number) +// 2) no guard bits are set (valid positive number) +assign iovf = !( &sel_r[39:32] | &(~sel_r[39:32]) ); + +// saturation +always@(iovf or ovm or sel_r) + if (ovm & iovf) + if (sel_r[39]) // negate overflow + iresult <= #1 40'hff_8000_0000; + else // positive overflow + iresult <= #1 40'h00_7fff_ffff; + else + iresult <= #1 sel_r; + +// +// generate registers +// + +// generate bypass output +assign bp_result = iresult; + +// result +always@(posedge clk) + if (ena & we) + result <= #1 iresult; + +// ovf, zf +always@(posedge clk) + if (ena & we) + begin + ovf <= #1 iovf; + zf <= #1 ~|iresult; + end + +endmodule + Index: oc54x/trunk/rtl/verilog/oc54_bshft.v =================================================================== --- oc54x/trunk/rtl/verilog/oc54_bshft.v (nonexistent) +++ oc54x/trunk/rtl/verilog/oc54_bshft.v (revision 5) @@ -0,0 +1,164 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, Barrel Shifter //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// +// Xilinx Virtex-E WC: 348 CLB slices @ 68MHz +// + +// CVS Log +// +// $Id: oc54_bshft.v,v 1.1.1.1 2002-04-10 09:34:40 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:40 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + +`include "timescale.v" + +module oc54_bshft ( + clk, ena, + a, b, cb, db, + bp_a, bp_b, bp_ar, bp_br, + l_na, sxm, seli, selo, + t, asm, imm, + result, co + ); + +// +// parameters +// + +// +// inputs & outputs +// +input clk; +input ena; +input [39:0] a, b; // accumulator +input [15:0] cb, db; // memory data inputs +input [39:0] bp_ar, bp_br; // bypass a register, bypass b register +input bp_a, bp_b; // bypass select +input sxm; // sign extend mode +input l_na; // logical/not arithmetic shift +input [ 1:0] seli; // select operand (input) +input [ 1:0] selo; // select operator +input [ 5:0] t; // TREG, 6lsbs +input [ 4:0] asm; // asm bits +input [ 4:0] imm; // 5bit immediate value +output [39:0] result; +output co; // carry out output + +reg [39:0] result; +reg co; + +// +// variables +// + +reg [ 5:0] shift_cnt; +reg [39:0] operand; + +// +// module body +// + + +// +// generate shift count +// +always@(selo or t or asm or imm) + case (selo) // synopsis full_case parallel_case + 2'b00: shift_cnt = t; + 2'b01: shift_cnt = {asm[4], asm}; + 2'b10: shift_cnt = {imm[4], imm}; + 2'b11: shift_cnt = {imm[4:3], imm[3:0]}; + endcase + +// +// generate operand +// +always@(seli or bp_a or a or bp_ar or bp_b or b or bp_br or cb or db) + case (seli) // synopsis full_case parallel_case + 2'b00 : operand = bp_b ? bp_br : b; + 2'b01 : operand = bp_a ? bp_ar : a; + 2'b10 : operand = db; // 16bit operand databus + 2'b11 : operand = {cb, db}; // 32bit operand + endcase + +// +// generate shifter +// +always@(posedge clk) + if (ena) + if (l_na) // logical shift + if (shift_cnt[5]) + begin + result[39:32] <= #1 8'h0; + result[31: 0] <= #1 operand[31:0] >> (~shift_cnt[4:0] +1'h1); + co <= #1 operand[ ~shift_cnt[4:0] ]; + end + else if ( ~|shift_cnt[4:0] ) + begin + result <= #1 operand; + co <= #1 1'b0; + end + else + begin + result[39:32] <= #1 8'h0; + result[31: 0] <= #1 operand[31:0] << shift_cnt[4:0]; + co <= #1 operand[ 5'h1f - shift_cnt[4:0] ]; + end + else // arithmetic shift + if (shift_cnt[5]) + begin + if (sxm) + result <= #1 { {16{operand[39]}} ,operand} >> (~shift_cnt[4:0] +1'h1); + else + result <= #1 operand >> (~shift_cnt[4:0] +1'h1); + co <= #1 operand[ ~shift_cnt[4:0] ]; + end + else + begin + result <= #1 operand << shift_cnt[4:0]; + co <= #1 operand[ 6'h27 - shift_cnt[4:0] ]; + end + +endmodule + + + Index: oc54x/trunk/rtl/verilog/oc54_cpu.v =================================================================== --- oc54x/trunk/rtl/verilog/oc54_cpu.v (nonexistent) +++ oc54x/trunk/rtl/verilog/oc54_cpu.v (revision 5) @@ -0,0 +1,287 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, CPU //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// +// NOTE: Read the pipeline information for the CMPS instruction +// + +// +// Xilinx Virtex-E WC: 41 CLB slices @ 130MHz +// + +// CVS Log +// +// $Id: oc54_cpu.v,v 1.1.1.1 2002-04-10 09:34:41 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:41 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + +`include "timescale.v" + +module oc54_cpu ( + clk_i, + ena_mac_i, ena_alu_i, ena_bs_i, ena_exp_i, + ena_treg_i, ena_acca_i, ena_accb_i, + + // mac + mac_sel_xm_i, mac_sel_ym_i, mac_sel_ya_i, + mac_xm_sx_i, mac_ym_sx_i, mac_add_sub_i, + + // alu + alu_inst_i, alu_sel_i, alu_doublet_i, + + // bs + bs_sel_i, bs_selo_i, l_na_i, + cssu_sel_i, is_cssu_i, + + // + exp_sel_i, treg_sel_i, + acca_sel_i, accb_sel_i, + + // common + pb_i, cb_i, db_i, + bp_a_i, bp_b_i, + + ovm_i, frct_i, smul_i, sxm_i, c16_i, rnd_i, + c_i, tc_i, + asm_i, imm_i, + + // outputs + c_alu_o, c_bs_o, tc_cssu_o, tc_alu_o, + ovf_a_o, zf_a_o, ovf_b_o, zf_b_o, + trn_o, eb_o + ); + +// +// parameters +// + +// +// inputs & outputs +// +input clk_i; +input ena_mac_i, ena_alu_i, ena_bs_i, ena_exp_i; +input ena_treg_i, ena_acca_i, ena_accb_i; +input [ 1:0] mac_sel_xm_i, mac_sel_ym_i, mac_sel_ya_i; +input mac_xm_sx_i, mac_ym_sx_i, mac_add_sub_i; +input [ 6:0] alu_inst_i; +input [ 1:0] alu_sel_i; +input alu_doublet_i; +input [ 1:0] bs_sel_i, bs_selo_i; +input l_na_i; +input cssu_sel_i, is_cssu_i; +input exp_sel_i, treg_sel_i; +input [ 1:0] acca_sel_i, accb_sel_i; +input [15:0] pb_i, cb_i, db_i; +input bp_a_i, bp_b_i; +input ovm_i, frct_i, smul_i, sxm_i; +input c16_i, rnd_i, c_i, tc_i, asm_i, imm_i; +output c_alu_o, c_bs_o, tc_cssu_o, tc_alu_o; +output ovf_a_o, zf_a_o, ovf_b_o, zf_b_o; +output [15:0] trn_o, eb_o; + +// +// variables +// + +wire [39:0] acc_a, acc_b, bp_ar, bp_br; +wire [39:0] mac_result, alu_result, bs_result; +wire [15:0] treg; +wire [ 5:0] exp_result; + +// +// module body +// + + // + // instantiate MAC + oc54_mac cpu_mac( + .clk(clk_i), // clock input + .ena(ena_mac_i), // MAC clock enable input + .a(acc_a), // accumulator A input + .b(acc_b), // accumulator B input + .t(treg), // TREG input + .p(pb_i), // Program Data Bus input + .c(cb_i), // Coefficient Data Bus input + .d(db_i), // Data Bus input + .sel_xm(mac_sel_xm_i), // select multiplier-X input + .sel_ym(mac_sel_ym_i), // select muliplier-Y input + .sel_ya(mac_sel_ya_i), // select adder-Y input + .bp_a(bp_a_i), // bypass accumulator A select input + .bp_b(bp_b_i), // bypass accumulator B select input + .bp_ar(bp_ar), // bypass accumulator A input + .bp_br(bp_br), // bypass accumulator B input + .xm_s(mac_xm_sx_i), // sign extend multiplier x-input + .ym_s(mac_ym_sx_i), // sign extend multiplier y-input + .ovm(ovm_i), // overflow mode input + .frct(frct_i), // fractional mode input + .smul(smul_i), // saturate on multiply input + .add_sub(mac_add_sub_i), // add/subtract input + .result(mac_result) // MAC result output + ); + + // + // instantiate ALU + oc54_alu cpu_alu( + .clk(clk_i), // clock input + .ena(ena_alu_i), // ALU clock enable input + .inst(alu_inst_i), // ALU instruction + .seli(alu_sel_i), // ALU x-input select + .doublet(alu_doublet_i), // double t {treg, treg} + .a(acc_a), // accumulator A input + .b(acc_b), // accumulator B input + .s(bs_result), // barrel shifter result input + .t(treg), // TREG input + .cb(cb_i), // Coefficient Data Bus input + .bp_a(bp_a_i), // bypass accumulator A select input + .bp_b(bp_b_i), // bypass accumulator B select input + .bp_ar(bp_ar), // bypass accumulator A input + .bp_br(bp_br), // bypass accumulator B input + .c16(c16_i), // c16 (double 16/long-word) input + .sxm(sxm_i), // sign extend mode input + .ci(c_i), // carry input + .tci(tc_i), // test/control flag input + .co(c_alu_o), // ALU carry output + .tco(tc_alu_o), // ALU test/control flag output + .result(alu_result) // ALU result output + ); + + // + // instantiate barrel shifter + oc54_bshft cpu_bs( + .clk(clk_i), // clock input + .ena(ena_bs_i), // BS clock enable input + .seli(bs_sel_i), // BS operand select input + .a(acc_a), // accumulator A input + .b(acc_b), // accumulator B input + .cb(cb_i), // Coefficient Data Bus input + .db(db_i), // Data Bus input + .bp_a(bp_a_i), // bypass accumulator A select input + .bp_b(bp_b_i), // bypass accumulator B select input + .bp_ar(bp_ar), // bypass accumulator A input + .bp_br(bp_br), // bypass accumulator B input + .selo(bs_selo_i), // BS operator select input + .t(treg), // TREG input + .asm(asm_i), // Accumulator Shift Mode input + .imm(imm_i), // Opcode Immediate input + .l_na(l_na_i), // BS logical/arithmetic shift mode input + .sxm(sxm_i), // sign extend mode input + .co(c_bs_o), // BS carry output (1 cycle ahead) + .result(bs_result) // BS result output + ); + + // instantiate Compare Select Store Unit + oc54_cssu cpu_cssu( + .clk(clk_i), // clock input + .ena(ena_bs_i), // BS/CSSU clock enable input + .sel_acc(cssu_sel_i), // CSSU accumulator select input + .a(acc_a), // accumulator A input + .b(acc_b), // accumulator B input + .s(bs_result), // BarrelShifter result input + .is_cssu(is_cssu_i), // CSSU/NormalShift operation + .tco(tc_cssu_o), // test/control flag output + .trn(trn_o), // Transition register output + .result(eb_o) // Result Data Bus output + ); + + // + // instantiate Exponent Encoder + oc54_exp cpu_exp_enc( + .clk(clk_i), // clock input + .ena(ena_exp_i), // Exponent Encoder clock enable input + .sel_acc(exp_sel_i), // ExpE. accumulator select input + .a(acc_a), // accumulator A input + .b(acc_b), // accumulator B input + .bp_a(bp_a_i), // bypass accumulator A select input + .bp_b(bp_b_i), // bypass accumulator B select input + .bp_ar(bp_ar), // bypass accumulator A input + .bp_br(bp_br), // bypass accumulator B input + .result(exp_result) // Exponent Encoder result output + ); + + // + // instantiate Temporary Register + oc54_treg cpu_treg( + .clk(clk_i), // clock input + .ena(ena_treg_i), // treg clock enable input + .we(1'b1), // treg write enable input + .seli(treg_sel_i), // treg select input + .exp(exp_result), // Exponent Encoder Result input + .d(db_i), // Data Bus input + .result(treg) // TREG + ); + + // + // instantiate accumulators + oc54_acc cpu_acc_a( + .clk(clk_i), // clock input + .ena(ena_acca_i), // accumulator A clock enable input + .seli(acca_sel_i), // accumulator A select input + .we(1'b1), // write enable input + .a(acc_a), // accumulator A input + .b(acc_b), // accumulator B input + .alu(alu_result), // ALU result input + .mac(mac_result), // MAC result input + .ovm(ovm_i), // overflow mode input + .rnd(rnd_i), // mac-rounding input + .zf(zf_a_o), // accumulator A zero flag output + .ovf(ovf_a_o), // accumulator A overflow flag output + .bp_result(bp_ar), // bypass accumulator A output + .result(acc_a) // accumulator A output + ); + + oc54_acc cpu_acc_b( + .clk(clk_i), // clock input + .ena(ena_accb_i), // accumulator B clock enable input + .seli(accb_sel_i), // accumulator B select input + .we(1'b1), // write enable input + .a(acc_a), // accumulator A input + .b(acc_b), // accumulator B input + .alu(alu_result), // ALU result input + .mac(mac_result), // MAC result input + .ovm(ovm_i), // overflow mode input + .rnd(rnd_i), // mac-rounding input + .zf(zf_b_o), // accumulator B zero flag output + .ovf(ovf_b_o), // accumulator B overflow flag output + .bp_result(bp_br), // bypass accumulator B output + .result(acc_b) // accumulator B output + ); +endmodule + Index: oc54x/trunk/rtl/verilog/oc54_exp.v =================================================================== --- oc54x/trunk/rtl/verilog/oc54_exp.v (nonexistent) +++ oc54x/trunk/rtl/verilog/oc54_exp.v (revision 5) @@ -0,0 +1,300 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, Exponent Encoder //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// +// Xilinx Virtex-E WC: 116 CLB slices @ 74MHz, pass 4 +// + +// CVS Log +// +// $Id: oc54_exp.v,v 1.1.1.1 2002-04-10 09:34:41 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:41 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + +`include "timescale.v" + +module oc54_exp ( + clk, ena, + sel_acc, + a, b, + bp_ar, bp_br, + bp_a, bp_b, + result + ); + +// +// parameters +// + +// +// inputs & outputs +// +input clk; +input ena; +input sel_acc; // select accumulator +input [39:0] a, b; // accumulator inputs +input [39:0] bp_ar, bp_br; // bypass accumulator a / b +input bp_a, bp_b; // bypass selects +output [ 5:0] result; + +reg [5:0] result; + +// +// variables +// +reg [39:0] acc; + +///////////////// +// module body // +///////////////// 34('1') - 1(sign bit) - 8 + +// +// generate input selection +// + +// input selection +always@(posedge clk) + if (ena) + if (sel_acc) + acc = bp_b ? bp_br : b; + else + acc = bp_a ? bp_ar : a; + +// +// Generate exponent encoder +// +// The result of the exponent encoder is the number of leading +// redundant bits, except the sign-bit, -8. Exp is in the -8 to +31 range. + +// 00_0110 -> 11_1001 -> 11_1010 + +always@(posedge clk) + if (ena) + casex (acc) // synopsis full_case parallel_case + // + // positive numbers + // + 40'b01??_????_????_????_????_????_????_????_????_????: + result <= #1 6'h38; // 1 (leading red. bit) - 1 (sign bit) - 8 = -8 + 40'b001?_????_????_????_????_????_????_????_????_????: + result <= #1 6'h39; // 2 (leading red. bit) - 1 (sign bit) - 8 = -7 + 40'b0001_????_????_????_????_????_????_????_????_????: + result <= #1 6'h3a; // 3 (leading red. bit) - 1 (sign bit) - 8 = -6 + 40'b0000_1???_????_????_????_????_????_????_????_????: + result <= #1 6'h3b; // 4 (leading red. bit) - 1 (sign bit) - 8 = -5 + + 40'b0000_01??_????_????_????_????_????_????_????_????: + result <= #1 6'h3c; // 5 (leading red. bit) - 1 (sign bit) - 8 = -4 + 40'b0000_001?_????_????_????_????_????_????_????_????: + result <= #1 6'h3d; // 6 (leading red. bit) - 1 (sign bit) - 8 = -3 + 40'b0000_0001_????_????_????_????_????_????_????_????: + result <= #1 6'h3e; // 7 (leading red. bit) - 1 (sign bit) - 8 = -2 + 40'b0000_0000_1???_????_????_????_????_????_????_????: + result <= #1 6'h3f; // 8 (leading red. bit) - 1 (sign bit) - 8 = -1 + + 40'b0000_0000_01??_????_????_????_????_????_????_????: + result <= #1 6'h00; // 9 (leading red. bit) - 1 (sign bit) - 8 = 0 + 40'b0000_0000_001?_????_????_????_????_????_????_????: + result <= #1 6'h01; //10 (leading red. bit) - 1 (sign bit) - 8 = 1 + 40'b0000_0000_0001_????_????_????_????_????_????_????: + result <= #1 6'h02; //11 (leading red. bit) - 1 (sign bit) - 8 = 2 + 40'b0000_0000_0000_1???_????_????_????_????_????_????: + result <= #1 6'h03; //12 (leading red. bit) - 1 (sign bit) - 8 = 3 + + 40'b0000_0000_0000_01??_????_????_????_????_????_????: + result <= #1 6'h04; //13 (leading red. bit) - 1 (sign bit) - 8 = 4 + 40'b0000_0000_0000_001?_????_????_????_????_????_????: + result <= #1 6'h05; //14 (leading red. bit) - 1 (sign bit) - 8 = 5 + 40'b0000_0000_0000_0001_????_????_????_????_????_????: + result <= #1 6'h06; //15 (leading red. bit) - 1 (sign bit) - 8 = 6 + 40'b0000_0000_0000_0000_1???_????_????_????_????_????: + result <= #1 6'h07; //16 (leading red. bit) - 1 (sign bit) - 8 = 7 + + 40'b0000_0000_0000_0000_01??_????_????_????_????_????: + result <= #1 6'h08; //17 (leading red. bit) - 1 (sign bit) - 8 = 8 + 40'b0000_0000_0000_0000_001?_????_????_????_????_????: + result <= #1 6'h09; //18 (leading red. bit) - 1 (sign bit) - 8 = 9 + 40'b0000_0000_0000_0000_0001_????_????_????_????_????: + result <= #1 6'h0a; //19 (leading red. bit) - 1 (sign bit) - 8 =10 + 40'b0000_0000_0000_0000_0000_1???_????_????_????_????: + result <= #1 6'h0b; //20 (leading red. bit) - 1 (sign bit) - 8 =11 + + 40'b0000_0000_0000_0000_0000_01??_????_????_????_????: + result <= #1 6'h0c; //21 (leading red. bit) - 1 (sign bit) - 8 =12 + 40'b0000_0000_0000_0000_0000_001?_????_????_????_????: + result <= #1 6'h0d; //22 (leading red. bit) - 1 (sign bit) - 8 =13 + 40'b0000_0000_0000_0000_0000_0001_????_????_????_????: + result <= #1 6'h0e; //23 (leading red. bit) - 1 (sign bit) - 8 =14 + 40'b0000_0000_0000_0000_0000_0000_1???_????_????_????: + result <= #1 6'h0f; //24 (leading red. bit) - 1 (sign bit) - 8 =15 + + 40'b0000_0000_0000_0000_0000_0000_01??_????_????_????: + result <= #1 6'h10; //25 (leading red. bit) - 1 (sign bit) - 8 =16 + 40'b0000_0000_0000_0000_0000_0000_001?_????_????_????: + result <= #1 6'h11; //26 (leading red. bit) - 1 (sign bit) - 8 =17 + 40'b0000_0000_0000_0000_0000_0000_0001_????_????_????: + result <= #1 6'h12; //27 (leading red. bit) - 1 (sign bit) - 8 =18 + 40'b0000_0000_0000_0000_0000_0000_0000_1???_????_????: + result <= #1 6'h13; //28 (leading red. bit) - 1 (sign bit) - 8 =19 + + 40'b0000_0000_0000_0000_0000_0000_0000_01??_????_????: + result <= #1 6'h14; //29 (leading red. bit) - 1 (sign bit) - 8 =20 + 40'b0000_0000_0000_0000_0000_0000_0000_001?_????_????: + result <= #1 6'h15; //30 (leading red. bit) - 1 (sign bit) - 8 =21 + 40'b0000_0000_0000_0000_0000_0000_0000_0001_????_????: + result <= #1 6'h16; //31 (leading red. bit) - 1 (sign bit) - 8 =22 + 40'b0000_0000_0000_0000_0000_0000_0000_0000_1???_????: + result <= #1 6'h17; //32 (leading red. bit) - 1 (sign bit) - 8 =23 + + 40'b0000_0000_0000_0000_0000_0000_0000_0000_01??_????: + result <= #1 6'h18; //33 (leading red. bit) - 1 (sign bit) - 8 =24 + 40'b0000_0000_0000_0000_0000_0000_0000_0000_001?_????: + result <= #1 6'h19; //34 (leading red. bit) - 1 (sign bit) - 8 =25 + 40'b0000_0000_0000_0000_0000_0000_0000_0000_0001_????: + result <= #1 6'h1a; //35 (leading red. bit) - 1 (sign bit) - 8 =26 + 40'b0000_0000_0000_0000_0000_0000_0000_0000_0000_1???: + result <= #1 6'h1b; //36 (leading red. bit) - 1 (sign bit) - 8 =27 + + 40'b0000_0000_0000_0000_0000_0000_0000_0000_0000_01??: + result <= #1 6'h1c; //37 (leading red. bit) - 1 (sign bit) - 8 =28 + 40'b0000_0000_0000_0000_0000_0000_0000_0000_0000_001?: + result <= #1 6'h1d; //38 (leading red. bit) - 1 (sign bit) - 8 =29 + 40'b0000_0000_0000_0000_0000_0000_0000_0000_0000_0001: + result <= #1 6'h1e; //39 (leading red. bit) - 1 (sign bit) - 8 =30 + 40'b0000_0000_0000_0000_0000_0000_0000_0000_0000_0000: + result <= #1 6'h1f; //40 (leading red. bit) - 1 (sign bit) - 8 =31 + + // + // negative numbers + // + 40'b10??_????_????_????_????_????_????_????_????_????: + result <= #1 6'h38; // 1 (leading red. bit) - 1 (sign bit) - 8 = -8 + 40'b110?_????_????_????_????_????_????_????_????_????: + result <= #1 6'h39; // 2 (leading red. bit) - 1 (sign bit) - 8 = -7 + 40'b1110_????_????_????_????_????_????_????_????_????: + result <= #1 6'h3a; // 3 (leading red. bit) - 1 (sign bit) - 8 = -6 + 40'b1111_0???_????_????_????_????_????_????_????_????: + result <= #1 6'h3b; // 4 (leading red. bit) - 1 (sign bit) - 8 = -5 + + 40'b1111_10??_????_????_????_????_????_????_????_????: + result <= #1 6'h3c; // 5 (leading red. bit) - 1 (sign bit) - 8 = -4 + 40'b1111_110?_????_????_????_????_????_????_????_????: + result <= #1 6'h3d; // 6 (leading red. bit) - 1 (sign bit) - 8 = -3 + 40'b1111_1110_????_????_????_????_????_????_????_????: + result <= #1 6'h3e; // 7 (leading red. bit) - 1 (sign bit) - 8 = -2 + 40'b1111_1111_0???_????_????_????_????_????_????_????: + result <= #1 6'h3f; // 8 (leading red. bit) - 1 (sign bit) - 8 = -1 + + 40'b1111_1111_10??_????_????_????_????_????_????_????: + result <= #1 6'h00; // 9 (leading red. bit) - 1 (sign bit) - 8 = 0 + 40'b1111_1111_110?_????_????_????_????_????_????_????: + result <= #1 6'h01; //10 (leading red. bit) - 1 (sign bit) - 8 = 1 + 40'b1111_1111_1110_????_????_????_????_????_????_????: + result <= #1 6'h02; //11 (leading red. bit) - 1 (sign bit) - 8 = 2 + 40'b1111_1111_1111_0???_????_????_????_????_????_????: + result <= #1 6'h03; //12 (leading red. bit) - 1 (sign bit) - 8 = 3 + + 40'b1111_1111_1111_10??_????_????_????_????_????_????: + result <= #1 6'h04; //13 (leading red. bit) - 1 (sign bit) - 8 = 4 + 40'b1111_1111_1111_110?_????_????_????_????_????_????: + result <= #1 6'h05; //14 (leading red. bit) - 1 (sign bit) - 8 = 5 + 40'b1111_1111_1111_1110_????_????_????_????_????_????: + result <= #1 6'h06; //15 (leading red. bit) - 1 (sign bit) - 8 = 6 + 40'b1111_1111_1111_1111_0???_????_????_????_????_????: + result <= #1 6'h07; //16 (leading red. bit) - 1 (sign bit) - 8 = 7 + + 40'b1111_1111_1111_1111_10??_????_????_????_????_????: + result <= #1 6'h08; //17 (leading red. bit) - 1 (sign bit) - 8 = 8 + 40'b1111_1111_1111_1111_110?_????_????_????_????_????: + result <= #1 6'h09; //18 (leading red. bit) - 1 (sign bit) - 8 = 9 + 40'b1111_1111_1111_1111_1110_????_????_????_????_????: + result <= #1 6'h0a; //19 (leading red. bit) - 1 (sign bit) - 8 =10 + 40'b1111_1111_1111_1111_1111_0???_????_????_????_????: + result <= #1 6'h0b; //20 (leading red. bit) - 1 (sign bit) - 8 =11 + + 40'b1111_1111_1111_1111_1111_10??_????_????_????_????: + result <= #1 6'h0c; //21 (leading red. bit) - 1 (sign bit) - 8 =12 + 40'b1111_1111_1111_1111_1111_110?_????_????_????_????: + result <= #1 6'h0d; //22 (leading red. bit) - 1 (sign bit) - 8 =13 + 40'b1111_1111_1111_1111_1111_1110_????_????_????_????: + result <= #1 6'h0e; //23 (leading red. bit) - 1 (sign bit) - 8 =14 + 40'b1111_1111_1111_1111_1111_1111_0???_????_????_????: + result <= #1 6'h0f; //24 (leading red. bit) - 1 (sign bit) - 8 =15 + + 40'b1111_1111_1111_1111_1111_1111_10??_????_????_????: + result <= #1 6'h10; //25 (leading red. bit) - 1 (sign bit) - 8 =16 + 40'b1111_1111_1111_1111_1111_1111_110?_????_????_????: + result <= #1 6'h11; //26 (leading red. bit) - 1 (sign bit) - 8 =17 + 40'b1111_1111_1111_1111_1111_1111_1110_????_????_????: + result <= #1 6'h12; //27 (leading red. bit) - 1 (sign bit) - 8 =18 + 40'b1111_1111_1111_1111_1111_1111_1111_0???_????_????: + result <= #1 6'h13; //28 (leading red. bit) - 1 (sign bit) - 8 =19 + + 40'b1111_1111_1111_1111_1111_1111_1111_10??_????_????: + result <= #1 6'h14; //29 (leading red. bit) - 1 (sign bit) - 8 =20 + 40'b1111_1111_1111_1111_1111_1111_1111_110?_????_????: + result <= #1 6'h15; //30 (leading red. bit) - 1 (sign bit) - 8 =21 + 40'b1111_1111_1111_1111_1111_1111_1111_1110_????_????: + result <= #1 6'h16; //31 (leading red. bit) - 1 (sign bit) - 8 =22 + 40'b1111_1111_1111_1111_1111_1111_1111_1111_0???_????: + result <= #1 6'h17; //32 (leading red. bit) - 1 (sign bit) - 8 =23 + + 40'b1111_1111_1111_1111_1111_1111_1111_1111_10??_????: + result <= #1 6'h18; //33 (leading red. bit) - 1 (sign bit) - 8 =24 + 40'b1111_1111_1111_1111_1111_1111_1111_1111_110?_????: + result <= #1 6'h19; //34 (leading red. bit) - 1 (sign bit) - 8 =25 + 40'b1111_1111_1111_1111_1111_1111_1111_1111_1110_????: + result <= #1 6'h1a; //35 (leading red. bit) - 1 (sign bit) - 8 =26 + 40'b1111_1111_1111_1111_1111_1111_1111_1111_1111_0???: + result <= #1 6'h1b; //36 (leading red. bit) - 1 (sign bit) - 8 =27 + + 40'b1111_1111_1111_1111_1111_1111_1111_1111_1111_10??: + result <= #1 6'h1c; //37 (leading red. bit) - 1 (sign bit) - 8 =28 + 40'b1111_1111_1111_1111_1111_1111_1111_1111_1111_110?: + result <= #1 6'h1d; //38 (leading red. bit) - 1 (sign bit) - 8 =29 + 40'b1111_1111_1111_1111_1111_1111_1111_1111_1111_1110: + result <= #1 6'h1e; //39 (leading red. bit) - 1 (sign bit) - 8 =30 + 40'b1111_1111_1111_1111_1111_1111_1111_1111_1111_1111: + result <= #1 6'h1f; //40 (leading red. bit) - 1 (sign bit) - 8 =31 + endcase + +endmodule + Index: oc54x/trunk/rtl/verilog/timescale.v =================================================================== --- oc54x/trunk/rtl/verilog/timescale.v (nonexistent) +++ oc54x/trunk/rtl/verilog/timescale.v (revision 5) @@ -0,0 +1 @@ +`timescale 1ns / 10ps \ No newline at end of file Index: oc54x/trunk/rtl/verilog/oc54_cssu.v =================================================================== --- oc54x/trunk/rtl/verilog/oc54_cssu.v (nonexistent) +++ oc54x/trunk/rtl/verilog/oc54_cssu.v (revision 5) @@ -0,0 +1,122 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, Compare Select and Store Unit (CSSU) //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// +// NOTE: Read the pipeline information for the CMPS instruction +// + +// +// Xilinx Virtex-E WC: 41 CLB slices @ 130MHz +// + +// CVS Log +// +// $Id: oc54_cssu.v,v 1.1.1.1 2002-04-10 09:34:41 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:41 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + +`include "timescale.v" + +module oc54_cssu ( + clk, ena, + sel_acc, is_cssu, + a, b, s, + tco, + trn, result + ); + +// +// parameters +// + +// +// inputs & outputs +// +input clk; +input ena; +input sel_acc; // select input +input is_cssu; // is this a cssu operation ? +input [39:0] a, b, s; // accumulators, shifter input +output tco; // tc-out +output [15:0] trn, result; + +reg tco; +reg [15:0] trn, result; + +// +// variables +// + +wire [31:0] acc; // selected accumulator +wire acc_cmp; // acc[31;16]>acc[15:0] ?? +// +// module body +// + +// +// generate input selection +// + +// input selection +assign acc = sel_acc ? b[31:0] : a[31:0]; + +assign acc_cmp = acc[31:16] > acc[15:0]; + +// result +always@(posedge clk) + if (ena) + begin + if (is_cssu) + if (acc_cmp) + result <= #1 acc[31:16]; + else + result <= #1 acc[15:0]; + else + result <= #1 s[15:0]; + + if (is_cssu) + trn <= #1 {trn[14:0], ~acc_cmp}; + + tco <= #1 ~acc_cmp; + end +endmodule + + Index: oc54x/trunk/rtl/verilog/oc54_alu_defines.v =================================================================== --- oc54x/trunk/rtl/verilog/oc54_alu_defines.v (nonexistent) +++ oc54x/trunk/rtl/verilog/oc54_alu_defines.v (revision 5) @@ -0,0 +1,113 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, ALU defines //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// CVS Log +// +// $Id: oc54_alu_defines.v,v 1.1.1.1 2002-04-10 09:34:40 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:40 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + + +// +// Encoding: bit[6] always zero +// bit[5:4] instuction type +// - 00: (dual) arithmetic +// - 01: logical (incl. shift) +// - 10: bit-test & compare +// - 11: reserved +// Leonardo-Spectrum seems to like the additional zero bit[6] in +// the encoding scheme. It produces the smallest and fastest code +// like this. (Why ???) +// + +// +// arithmetic instructions +// +`define ABS 7'b000_0000 +`define NEG 7'b000_0001 +`define ADD 7'b000_0010 +`define SUB 7'b000_0011 +`define MAX 7'b000_0100 +`define SUBC 7'b000_0101 + +// +// dual arithmetic instructions +// +`define DADD 7'b000_1000 +`define DSUB 7'b000_1100 +`define DRSUB 7'b000_1101 +`define DSUBADD 7'b000_1110 +`define DADDSUB 7'b000_1001 + +// +// logical instructions +// +`define NOT 7'b001_0000 +`define AND 7'b001_0001 +`define OR 7'b001_0010 +`define XOR 7'b001_0011 + +// +// shift instructions +// +`define ROL 7'b001_0100 +`define ROLTC 7'b001_0101 +`define ROR 7'b001_0110 +`define SHFT_CMP 7'b001_0111 + +// +// bit test instructions +// +`define BITF 7'b010_0000 +`define BTST 7'b010_0001 +`define CMP_EQ 7'b010_0100 +`define CMP_LT 7'b010_0101 +`define CMP_GT 7'b010_0110 +`define CMP_NEQ 7'b010_0111 + +// +// condition codes for CMP-test +// +`define EQ 2'b00 +`define LT 2'b01 +`define GT 2'b10 +`define NEQ 2'b11 + Index: oc54x/trunk/rtl/verilog/oc54_mac.v =================================================================== --- oc54x/trunk/rtl/verilog/oc54_mac.v (nonexistent) +++ oc54x/trunk/rtl/verilog/oc54_mac.v (revision 5) @@ -0,0 +1,164 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, MAC //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// +// Xilinx Virtex-E WC: 296 CLB slices @ 64MHz +// + +// CVS Log +// +// $Id: oc54_mac.v,v 1.1.1.1 2002-04-10 09:34:41 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:41 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + +`include "timescale.v" + +module oc54_mac ( + clk, ena, + a, b, t, p, c, d, + sel_xm, sel_ym, sel_ya, + bp_a, bp_b, bp_ar, bp_br, + xm_s, ym_s, + ovm, frct, smul, add_sub, + result + ); + +// +// parameters +// + +// +// inputs & outputs +// +input clk; +input ena; +input [15:0] t, p, c, d; // TREG, p-bus, c-bus, d-bus inputs +input [39:0] a, b; // accumulator inputs +input [ 1:0] sel_xm, sel_ym, sel_ya; // input selects +input [39:0] bp_ar, bp_br; // bypass accumulator a / b +input bp_a, bp_b; // bypass selects +input xm_s, ym_s; // sign extend xm, ym +input ovm, frct, smul, add_sub; +output [39:0] result; + +reg [39:0] result; + +// +// variables +// +reg [16:0] xm, ym; // multiplier inputs +reg [39:0] ya; // adder Y-input + +reg [33:0] mult_res; // multiplier result +wire [33:0] imult_res; // actual multiplier +reg [39:0] iresult; // mac-result + +///////////////// +// module body // +///////////////// + +// +// generate input selection +// + +// xm +always@(posedge clk) + if (ena) + case(sel_xm) // synopsis full_case parallel_case + 2'b00 : xm <= #1 {xm_s ? t[15] : 1'b0, t}; + 2'b01 : xm <= #1 {xm_s ? d[15] : 1'b0, d}; + 2'b10 : xm <= #1 bp_a ? bp_ar[32:16] : a[32:16]; + 2'b11 : xm <= #1 17'h0; + endcase + +// ym +always@(posedge clk) + if (ena) + case(sel_ym) // synopsis full_case parallel_case + 2'b00 : ym <= #1 {ym_s ? p[15] : 1'b0, p}; + 2'b01 : ym <= #1 bp_a ? bp_ar[32:16] : a[32:16]; + 2'b10 : ym <= #1 {ym_s ? d[15] : 1'b0, d}; + 2'b11 : ym <= #1 {ym_s ? c[15] : 1'b0, c}; + endcase + +// ya +always@(posedge clk) + if (ena) + casex(sel_ya) // synopsis full_case parallel_case + 2'b00 : ya <= #1 bp_a ? bp_ar : a; + 2'b01 : ya <= #1 bp_b ? bp_br : b; + 2'b1? : ya <= #1 40'h0; + endcase + +// +// generate multiplier +// +assign imult_res = (xm * ym); // actual multiplier + +always@(xm or ym or smul or ovm or frct or imult_res) + if (smul && ovm && frct && (xm[15:0] == 16'h8000) && (ym[15:0] == 16'h8000) ) + mult_res = 34'h7ff_ffff; + else if (frct) + mult_res = {imult_res[32:0], 1'b0}; // (imult_res << 1) + else + mult_res = imult_res; + +// +// generate mac-unit +// +always@(mult_res or ya or add_sub) + if (add_sub) + iresult = mult_res + ya; + else + iresult = mult_res - ya; + +// +// generate registers +// + +// result +always@(posedge clk) + if (ena) + result <= #1 iresult; + +endmodule + + Index: oc54x/trunk =================================================================== --- oc54x/trunk (nonexistent) +++ oc54x/trunk (revision 5)
oc54x/trunk Property changes : Added: svn:mergeinfo ## -0,0 +0,0 ## Index: oc54x/branches =================================================================== --- oc54x/branches (nonexistent) +++ oc54x/branches (revision 5)
oc54x/branches Property changes : Added: svn:mergeinfo ## -0,0 +0,0 ## Index: oc54x/tags/initial/rtl/verilog/oc54_alu.v =================================================================== --- oc54x/tags/initial/rtl/verilog/oc54_alu.v (nonexistent) +++ oc54x/tags/initial/rtl/verilog/oc54_alu.v (revision 5) @@ -0,0 +1,362 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, ALU //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// +// Xilinx Virtex-E WC: 617 CLB slices @ 58MHz +// + +// CVS Log +// +// $Id: oc54_alu.v,v 1.1.1.1 2002-04-10 09:34:40 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:40 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + +`include "timescale.v" +`include "oc54_alu_defines.v" + +module oc54_alu ( + clk, ena, inst, + seli, doublet, + a, b, s, t, cb, + bp_a, bp_b, bp_ar, bp_br, + c16, sxm, ci, tci, + co, tco, + result + ); + +// +// parameters +// + +// +// inputs & outputs +// +input clk; +input ena; +input [ 6:0] inst; // instruction +input [ 1:0] seli; // input selection +input doublet; // {T, T} +input [39:0] a, b, s; // accumulators + shifter inputs +input [15:0] t, cb; // TREG + c-bus input +input [39:0] bp_ar, bp_br; // bypass a register, bypass b register +input bp_a, bp_b; // bypass select +input c16, sxm; // dual-mode, sign-extend-mode, +input ci, tci; // carry in, tc-in +output co, tco; // carry out, overflow, zero, tc-out +output [39:0] result; + +reg co, tco; +reg [39:0] result; + +// +// variables +// +reg [39:0] iresult; +reg itco, ico; +reg [39:0] x; + +wire [39:0] y; + +reg dc16, dci, dtci; + +reg [6:0] dinst; + + +// +// module body +// + +// +// generate input selection, barrel-shifter has 1cycle delay +// +always@(posedge clk) + if (ena) + case(seli) // synopsis full_case parallel_case + 2'b00 : + if (doublet) + x <= #1 { {39-31{1'b0}}, t, t}; // is this correct ?? + else + x <= #1 { {39-15{sxm ? t[15] : 1'b0}}, t}; + 2'b01 : x <= #1 bp_a ? bp_ar : a; + 2'b10 : x <= #1 bp_b ? bp_br : b; + 2'b11 : x <= #1 { {39-15{sxm ? cb[15] : 1'b0}}, cb}; + endcase + +assign y = s; // second input from barrel-shifter + +// +// delay control signals +// +always@(posedge clk) + if (ena) + begin + dc16 <= #1 c16; + dci <= #1 ci; + dtci <= #1 tci; + dinst <= #1 inst; + end + +// +// generate ALU +// +always@(dinst or x or y or dc16 or dtci or dci) +begin + + ico = dci; + itco = dtci; + iresult = x; + + case(dinst) // synopsis full_case parallel_case + // + // Arithmetic instructions + // + `ABS : // absolute value + begin + if (x[39]) + iresult = (~x) + 1'b1; + else + iresult = x; + + ico = ~|(iresult); + end + + `ADD : // ALSO ADDC, ADDS. For ADD, ADDS ci = 1'b0; + begin + iresult = x + y + dci; + ico = iresult[32]; + end + + `MAX : // ALSO MIN. MAX: x==accA, y==accB, MIN: x==accB, y ==accA + begin + ico = (x > y); + iresult = (x > y) ? x : y; + end + + `NEG : + begin + iresult = (~x) + 1'b1; + ico = ~|(iresult); + end + + `SUB : // ALSO SUBB, SUBS. For SUB, SUBS ci = 1'b1; + begin + iresult = x - y - ~dci; + ico = iresult[32]; + end + + `SUBC : // subtract conditional (for division) + begin + // FIXME: Is this correct ?? How does SUBC affect the carry bit ? + iresult = x - y; + ico = iresult[32]; + + if ( iresult > 0 ) +// iresult = (iresult << 1) + 1'b1; + iresult = ({x[38:0], 1'b0}) + 1'b1; + else +// iresult = x << 1; + iresult = {x[38:0], 1'b0}; + end + + + // + // Dual Precision Arithmetic instructions + // + `DADD : + if (dc16) // dual add result_hi/lo = x_hi/lo + y_hi/lo + begin + iresult[39:16] = x[31:16] + y[31:16]; + iresult[15: 0] = x[15: 0] + y[15: 0]; + end + else // 32bit add result = x + y + {ico, iresult} = x + y; + + `DSUB : + if (dc16) // dual subtract result_hi/lo = x_hi/lo - y_hi/lo + begin + iresult[39:16] = x[31:16] - y[31:16]; + iresult[15: 0] = x[15: 0] - y[15: 0]; + end + else // 32bit subtract result = x - y + begin + iresult = x - y; + ico = iresult[32]; + end + + `DRSUB : // ALSO DSUBT: make sure x = {T, T} + if (dc16) // dual reverse sub. result_hi/lo = y_hi/lo - x_hi/lo + begin + iresult[39:16] = y[31:16] - x[31:16]; + iresult[15: 0] = y[15: 0] - x[15: 0]; + end + else // 32bit reverse sub.result = y - x + begin + iresult = y - x; + ico = iresult[32]; + end + + `DSUBADD : // DSADT: make sure x = {T, T} + if (dc16) + begin + iresult[39:16] = y[31:16] - x[31:16]; + iresult[15: 0] = y[15: 0] + x[15: 0]; + end + else + begin + iresult = y - x; + ico = iresult[32]; + end + + `DADDSUB : // DADST: make sure x = {T, T} + if (dc16) + begin + iresult[39:16] = y[31:16] + x[31:16]; + iresult[15: 0] = y[15: 0] - x[15: 0]; + end + else + begin + iresult = x + y; + ico = iresult[32]; + end + + // + // logical instructions + // + `NOT : // CMPL + iresult = ~x; + + `AND : + iresult = x & y; + + `OR : + iresult = x | y; + + `XOR : + iresult = x ^ y; + + // + // shift instructions + // + `ROL : + begin + iresult[39:32] = 8'h0; + iresult[31: 0] = {x[30:0], dci}; + ico = x[31]; + end + + `ROLTC : + begin + iresult[39:32] = 8'h0; + iresult[31: 0] = {x[30:0], dtci}; + ico = x[31]; + end + + `ROR : + begin + iresult[39:32] = 8'h0; + iresult[31: 0] = {dci, x[31:1]}; + ico = x[0]; + end + + `SHFT_CMP : + if (x[31] & x[30]) + begin +// iresult = x << 1; + iresult = {x[38:0], 1'b0}; + itco = 1'b0; + end + else + begin + iresult = x; + itco = 1'b1; + end + + // + // bit test and compare instructions + // + `BITF : + itco = ~|( x[15:0] & y[15:0] ); + + `BTST : // BIT, BITT y=Smem, x=imm or T + itco = y[ ~x[3:0] ]; // maybe do ~x at a higher level ?? + + `CMP_EQ : // ALSO CMPM. for CMPM [39:16]==0 + itco = ~|(x ^ y); + `CMP_LT : + itco = x < y; + `CMP_GT : + itco = x > y; + `CMP_NEQ : + itco = |(x ^ y); + + // + // NOP + // + default : + begin + ico = dci; + itco = dtci; + iresult = x; + end + endcase +end + + +// +// generate registers +// + +// result +always@(posedge clk) + if (ena) + result <= #1 iresult; + +// tco, co +always@(posedge clk) + if (ena) + begin + tco <= #1 itco; + co <= #1 ico; + end + +endmodule + + Index: oc54x/tags/initial/rtl/verilog/oc54_treg.v =================================================================== --- oc54x/tags/initial/rtl/verilog/oc54_treg.v (nonexistent) +++ oc54x/tags/initial/rtl/verilog/oc54_treg.v (revision 5) @@ -0,0 +1,99 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, Temporary Register (TREG) //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// +// NOTE: Read the pipeline information for the CMPS instruction +// + +// +// Xilinx Virtex-E WC: 41 CLB slices @ 130MHz +// + +// CVS Log +// +// $Id: oc54_treg.v,v 1.1.1.1 2002-04-10 09:34:41 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:41 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + +`include "timescale.v" + +module oc54_treg ( + clk, ena, + seli, we, + exp, d, + result + ); + +// +// parameters +// + +// +// inputs & outputs +// +input clk; +input ena; +input seli; // select input +input we; // store result +input [ 5:0] exp; // exponent encoder input +input [15:0] d; // DB input +output [15:0] result; + +reg [15:0] result; + +// +// variables +// + +// +// module body +// + +// +// generate input selection +// + +// result +always@(posedge clk) + if (ena) + if (we) + result <= #1 seli ? {10'h0, exp} : d; +endmodule Index: oc54x/tags/initial/rtl/verilog/oc54_acc.v =================================================================== --- oc54x/tags/initial/rtl/verilog/oc54_acc.v (nonexistent) +++ oc54x/tags/initial/rtl/verilog/oc54_acc.v (revision 5) @@ -0,0 +1,143 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, accumulator //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// +// Xilinx Virtex-E WC: 96 CLB slices @ 51MHz +// + +// CVS Log +// +// $Id: oc54_acc.v,v 1.1.1.1 2002-04-10 09:34:39 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:39 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + +`include "timescale.v" + +module oc54_acc ( + clk, ena, + seli, we, + a, b, alu, mac, + ovm, rnd, + zf, ovf, + result, bp_result + ); + +// +// parameters +// + +// +// inputs & outputs +// +input clk; +input ena; +input [ 1:0] seli; // select input +input we; // write enable +input [39:0] a, b, alu, mac; // accumulators, alu, mac input +input ovm, rnd; // overflow mode, saturate, round +output ovf, zf; // carry out, overflow, zero, tc-out +output [39:0] result; // accumulator register output +output [39:0] bp_result; // accumulator register bypass output + +reg ovf, zf; +reg [39:0] result; + +// +// variables +// +reg [39: 0] sel_r, iresult; // select results, final result +wire iovf; + +// +// module body +// + +// +// generate input selection +// + +// input selection & MAC-rounding +always@(seli or a or b or alu or mac or rnd) + case(seli) // synopsis full_case parallel_case + 2'b00: sel_r = a; + 2'b01: sel_r = b; + 2'b10: sel_r = alu; + 2'b11: sel_r = rnd ? (mac + 16'h8000) & 40'hff_ffff_0000 : mac; + endcase + +// overflow detection +// no overflow when: +// 1) all guard bits are set (valid negative number) +// 2) no guard bits are set (valid positive number) +assign iovf = !( &sel_r[39:32] | &(~sel_r[39:32]) ); + +// saturation +always@(iovf or ovm or sel_r) + if (ovm & iovf) + if (sel_r[39]) // negate overflow + iresult <= #1 40'hff_8000_0000; + else // positive overflow + iresult <= #1 40'h00_7fff_ffff; + else + iresult <= #1 sel_r; + +// +// generate registers +// + +// generate bypass output +assign bp_result = iresult; + +// result +always@(posedge clk) + if (ena & we) + result <= #1 iresult; + +// ovf, zf +always@(posedge clk) + if (ena & we) + begin + ovf <= #1 iovf; + zf <= #1 ~|iresult; + end + +endmodule + Index: oc54x/tags/initial/rtl/verilog/oc54_bshft.v =================================================================== --- oc54x/tags/initial/rtl/verilog/oc54_bshft.v (nonexistent) +++ oc54x/tags/initial/rtl/verilog/oc54_bshft.v (revision 5) @@ -0,0 +1,164 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, Barrel Shifter //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// +// Xilinx Virtex-E WC: 348 CLB slices @ 68MHz +// + +// CVS Log +// +// $Id: oc54_bshft.v,v 1.1.1.1 2002-04-10 09:34:40 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:40 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + +`include "timescale.v" + +module oc54_bshft ( + clk, ena, + a, b, cb, db, + bp_a, bp_b, bp_ar, bp_br, + l_na, sxm, seli, selo, + t, asm, imm, + result, co + ); + +// +// parameters +// + +// +// inputs & outputs +// +input clk; +input ena; +input [39:0] a, b; // accumulator +input [15:0] cb, db; // memory data inputs +input [39:0] bp_ar, bp_br; // bypass a register, bypass b register +input bp_a, bp_b; // bypass select +input sxm; // sign extend mode +input l_na; // logical/not arithmetic shift +input [ 1:0] seli; // select operand (input) +input [ 1:0] selo; // select operator +input [ 5:0] t; // TREG, 6lsbs +input [ 4:0] asm; // asm bits +input [ 4:0] imm; // 5bit immediate value +output [39:0] result; +output co; // carry out output + +reg [39:0] result; +reg co; + +// +// variables +// + +reg [ 5:0] shift_cnt; +reg [39:0] operand; + +// +// module body +// + + +// +// generate shift count +// +always@(selo or t or asm or imm) + case (selo) // synopsis full_case parallel_case + 2'b00: shift_cnt = t; + 2'b01: shift_cnt = {asm[4], asm}; + 2'b10: shift_cnt = {imm[4], imm}; + 2'b11: shift_cnt = {imm[4:3], imm[3:0]}; + endcase + +// +// generate operand +// +always@(seli or bp_a or a or bp_ar or bp_b or b or bp_br or cb or db) + case (seli) // synopsis full_case parallel_case + 2'b00 : operand = bp_b ? bp_br : b; + 2'b01 : operand = bp_a ? bp_ar : a; + 2'b10 : operand = db; // 16bit operand databus + 2'b11 : operand = {cb, db}; // 32bit operand + endcase + +// +// generate shifter +// +always@(posedge clk) + if (ena) + if (l_na) // logical shift + if (shift_cnt[5]) + begin + result[39:32] <= #1 8'h0; + result[31: 0] <= #1 operand[31:0] >> (~shift_cnt[4:0] +1'h1); + co <= #1 operand[ ~shift_cnt[4:0] ]; + end + else if ( ~|shift_cnt[4:0] ) + begin + result <= #1 operand; + co <= #1 1'b0; + end + else + begin + result[39:32] <= #1 8'h0; + result[31: 0] <= #1 operand[31:0] << shift_cnt[4:0]; + co <= #1 operand[ 5'h1f - shift_cnt[4:0] ]; + end + else // arithmetic shift + if (shift_cnt[5]) + begin + if (sxm) + result <= #1 { {16{operand[39]}} ,operand} >> (~shift_cnt[4:0] +1'h1); + else + result <= #1 operand >> (~shift_cnt[4:0] +1'h1); + co <= #1 operand[ ~shift_cnt[4:0] ]; + end + else + begin + result <= #1 operand << shift_cnt[4:0]; + co <= #1 operand[ 6'h27 - shift_cnt[4:0] ]; + end + +endmodule + + + Index: oc54x/tags/initial/rtl/verilog/oc54_cpu.v =================================================================== --- oc54x/tags/initial/rtl/verilog/oc54_cpu.v (nonexistent) +++ oc54x/tags/initial/rtl/verilog/oc54_cpu.v (revision 5) @@ -0,0 +1,287 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, CPU //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// +// NOTE: Read the pipeline information for the CMPS instruction +// + +// +// Xilinx Virtex-E WC: 41 CLB slices @ 130MHz +// + +// CVS Log +// +// $Id: oc54_cpu.v,v 1.1.1.1 2002-04-10 09:34:41 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:41 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + +`include "timescale.v" + +module oc54_cpu ( + clk_i, + ena_mac_i, ena_alu_i, ena_bs_i, ena_exp_i, + ena_treg_i, ena_acca_i, ena_accb_i, + + // mac + mac_sel_xm_i, mac_sel_ym_i, mac_sel_ya_i, + mac_xm_sx_i, mac_ym_sx_i, mac_add_sub_i, + + // alu + alu_inst_i, alu_sel_i, alu_doublet_i, + + // bs + bs_sel_i, bs_selo_i, l_na_i, + cssu_sel_i, is_cssu_i, + + // + exp_sel_i, treg_sel_i, + acca_sel_i, accb_sel_i, + + // common + pb_i, cb_i, db_i, + bp_a_i, bp_b_i, + + ovm_i, frct_i, smul_i, sxm_i, c16_i, rnd_i, + c_i, tc_i, + asm_i, imm_i, + + // outputs + c_alu_o, c_bs_o, tc_cssu_o, tc_alu_o, + ovf_a_o, zf_a_o, ovf_b_o, zf_b_o, + trn_o, eb_o + ); + +// +// parameters +// + +// +// inputs & outputs +// +input clk_i; +input ena_mac_i, ena_alu_i, ena_bs_i, ena_exp_i; +input ena_treg_i, ena_acca_i, ena_accb_i; +input [ 1:0] mac_sel_xm_i, mac_sel_ym_i, mac_sel_ya_i; +input mac_xm_sx_i, mac_ym_sx_i, mac_add_sub_i; +input [ 6:0] alu_inst_i; +input [ 1:0] alu_sel_i; +input alu_doublet_i; +input [ 1:0] bs_sel_i, bs_selo_i; +input l_na_i; +input cssu_sel_i, is_cssu_i; +input exp_sel_i, treg_sel_i; +input [ 1:0] acca_sel_i, accb_sel_i; +input [15:0] pb_i, cb_i, db_i; +input bp_a_i, bp_b_i; +input ovm_i, frct_i, smul_i, sxm_i; +input c16_i, rnd_i, c_i, tc_i, asm_i, imm_i; +output c_alu_o, c_bs_o, tc_cssu_o, tc_alu_o; +output ovf_a_o, zf_a_o, ovf_b_o, zf_b_o; +output [15:0] trn_o, eb_o; + +// +// variables +// + +wire [39:0] acc_a, acc_b, bp_ar, bp_br; +wire [39:0] mac_result, alu_result, bs_result; +wire [15:0] treg; +wire [ 5:0] exp_result; + +// +// module body +// + + // + // instantiate MAC + oc54_mac cpu_mac( + .clk(clk_i), // clock input + .ena(ena_mac_i), // MAC clock enable input + .a(acc_a), // accumulator A input + .b(acc_b), // accumulator B input + .t(treg), // TREG input + .p(pb_i), // Program Data Bus input + .c(cb_i), // Coefficient Data Bus input + .d(db_i), // Data Bus input + .sel_xm(mac_sel_xm_i), // select multiplier-X input + .sel_ym(mac_sel_ym_i), // select muliplier-Y input + .sel_ya(mac_sel_ya_i), // select adder-Y input + .bp_a(bp_a_i), // bypass accumulator A select input + .bp_b(bp_b_i), // bypass accumulator B select input + .bp_ar(bp_ar), // bypass accumulator A input + .bp_br(bp_br), // bypass accumulator B input + .xm_s(mac_xm_sx_i), // sign extend multiplier x-input + .ym_s(mac_ym_sx_i), // sign extend multiplier y-input + .ovm(ovm_i), // overflow mode input + .frct(frct_i), // fractional mode input + .smul(smul_i), // saturate on multiply input + .add_sub(mac_add_sub_i), // add/subtract input + .result(mac_result) // MAC result output + ); + + // + // instantiate ALU + oc54_alu cpu_alu( + .clk(clk_i), // clock input + .ena(ena_alu_i), // ALU clock enable input + .inst(alu_inst_i), // ALU instruction + .seli(alu_sel_i), // ALU x-input select + .doublet(alu_doublet_i), // double t {treg, treg} + .a(acc_a), // accumulator A input + .b(acc_b), // accumulator B input + .s(bs_result), // barrel shifter result input + .t(treg), // TREG input + .cb(cb_i), // Coefficient Data Bus input + .bp_a(bp_a_i), // bypass accumulator A select input + .bp_b(bp_b_i), // bypass accumulator B select input + .bp_ar(bp_ar), // bypass accumulator A input + .bp_br(bp_br), // bypass accumulator B input + .c16(c16_i), // c16 (double 16/long-word) input + .sxm(sxm_i), // sign extend mode input + .ci(c_i), // carry input + .tci(tc_i), // test/control flag input + .co(c_alu_o), // ALU carry output + .tco(tc_alu_o), // ALU test/control flag output + .result(alu_result) // ALU result output + ); + + // + // instantiate barrel shifter + oc54_bshft cpu_bs( + .clk(clk_i), // clock input + .ena(ena_bs_i), // BS clock enable input + .seli(bs_sel_i), // BS operand select input + .a(acc_a), // accumulator A input + .b(acc_b), // accumulator B input + .cb(cb_i), // Coefficient Data Bus input + .db(db_i), // Data Bus input + .bp_a(bp_a_i), // bypass accumulator A select input + .bp_b(bp_b_i), // bypass accumulator B select input + .bp_ar(bp_ar), // bypass accumulator A input + .bp_br(bp_br), // bypass accumulator B input + .selo(bs_selo_i), // BS operator select input + .t(treg), // TREG input + .asm(asm_i), // Accumulator Shift Mode input + .imm(imm_i), // Opcode Immediate input + .l_na(l_na_i), // BS logical/arithmetic shift mode input + .sxm(sxm_i), // sign extend mode input + .co(c_bs_o), // BS carry output (1 cycle ahead) + .result(bs_result) // BS result output + ); + + // instantiate Compare Select Store Unit + oc54_cssu cpu_cssu( + .clk(clk_i), // clock input + .ena(ena_bs_i), // BS/CSSU clock enable input + .sel_acc(cssu_sel_i), // CSSU accumulator select input + .a(acc_a), // accumulator A input + .b(acc_b), // accumulator B input + .s(bs_result), // BarrelShifter result input + .is_cssu(is_cssu_i), // CSSU/NormalShift operation + .tco(tc_cssu_o), // test/control flag output + .trn(trn_o), // Transition register output + .result(eb_o) // Result Data Bus output + ); + + // + // instantiate Exponent Encoder + oc54_exp cpu_exp_enc( + .clk(clk_i), // clock input + .ena(ena_exp_i), // Exponent Encoder clock enable input + .sel_acc(exp_sel_i), // ExpE. accumulator select input + .a(acc_a), // accumulator A input + .b(acc_b), // accumulator B input + .bp_a(bp_a_i), // bypass accumulator A select input + .bp_b(bp_b_i), // bypass accumulator B select input + .bp_ar(bp_ar), // bypass accumulator A input + .bp_br(bp_br), // bypass accumulator B input + .result(exp_result) // Exponent Encoder result output + ); + + // + // instantiate Temporary Register + oc54_treg cpu_treg( + .clk(clk_i), // clock input + .ena(ena_treg_i), // treg clock enable input + .we(1'b1), // treg write enable input + .seli(treg_sel_i), // treg select input + .exp(exp_result), // Exponent Encoder Result input + .d(db_i), // Data Bus input + .result(treg) // TREG + ); + + // + // instantiate accumulators + oc54_acc cpu_acc_a( + .clk(clk_i), // clock input + .ena(ena_acca_i), // accumulator A clock enable input + .seli(acca_sel_i), // accumulator A select input + .we(1'b1), // write enable input + .a(acc_a), // accumulator A input + .b(acc_b), // accumulator B input + .alu(alu_result), // ALU result input + .mac(mac_result), // MAC result input + .ovm(ovm_i), // overflow mode input + .rnd(rnd_i), // mac-rounding input + .zf(zf_a_o), // accumulator A zero flag output + .ovf(ovf_a_o), // accumulator A overflow flag output + .bp_result(bp_ar), // bypass accumulator A output + .result(acc_a) // accumulator A output + ); + + oc54_acc cpu_acc_b( + .clk(clk_i), // clock input + .ena(ena_accb_i), // accumulator B clock enable input + .seli(accb_sel_i), // accumulator B select input + .we(1'b1), // write enable input + .a(acc_a), // accumulator A input + .b(acc_b), // accumulator B input + .alu(alu_result), // ALU result input + .mac(mac_result), // MAC result input + .ovm(ovm_i), // overflow mode input + .rnd(rnd_i), // mac-rounding input + .zf(zf_b_o), // accumulator B zero flag output + .ovf(ovf_b_o), // accumulator B overflow flag output + .bp_result(bp_br), // bypass accumulator B output + .result(acc_b) // accumulator B output + ); +endmodule + Index: oc54x/tags/initial/rtl/verilog/oc54_exp.v =================================================================== --- oc54x/tags/initial/rtl/verilog/oc54_exp.v (nonexistent) +++ oc54x/tags/initial/rtl/verilog/oc54_exp.v (revision 5) @@ -0,0 +1,300 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, Exponent Encoder //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// +// Xilinx Virtex-E WC: 116 CLB slices @ 74MHz, pass 4 +// + +// CVS Log +// +// $Id: oc54_exp.v,v 1.1.1.1 2002-04-10 09:34:41 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:41 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + +`include "timescale.v" + +module oc54_exp ( + clk, ena, + sel_acc, + a, b, + bp_ar, bp_br, + bp_a, bp_b, + result + ); + +// +// parameters +// + +// +// inputs & outputs +// +input clk; +input ena; +input sel_acc; // select accumulator +input [39:0] a, b; // accumulator inputs +input [39:0] bp_ar, bp_br; // bypass accumulator a / b +input bp_a, bp_b; // bypass selects +output [ 5:0] result; + +reg [5:0] result; + +// +// variables +// +reg [39:0] acc; + +///////////////// +// module body // +///////////////// 34('1') - 1(sign bit) - 8 + +// +// generate input selection +// + +// input selection +always@(posedge clk) + if (ena) + if (sel_acc) + acc = bp_b ? bp_br : b; + else + acc = bp_a ? bp_ar : a; + +// +// Generate exponent encoder +// +// The result of the exponent encoder is the number of leading +// redundant bits, except the sign-bit, -8. Exp is in the -8 to +31 range. + +// 00_0110 -> 11_1001 -> 11_1010 + +always@(posedge clk) + if (ena) + casex (acc) // synopsis full_case parallel_case + // + // positive numbers + // + 40'b01??_????_????_????_????_????_????_????_????_????: + result <= #1 6'h38; // 1 (leading red. bit) - 1 (sign bit) - 8 = -8 + 40'b001?_????_????_????_????_????_????_????_????_????: + result <= #1 6'h39; // 2 (leading red. bit) - 1 (sign bit) - 8 = -7 + 40'b0001_????_????_????_????_????_????_????_????_????: + result <= #1 6'h3a; // 3 (leading red. bit) - 1 (sign bit) - 8 = -6 + 40'b0000_1???_????_????_????_????_????_????_????_????: + result <= #1 6'h3b; // 4 (leading red. bit) - 1 (sign bit) - 8 = -5 + + 40'b0000_01??_????_????_????_????_????_????_????_????: + result <= #1 6'h3c; // 5 (leading red. bit) - 1 (sign bit) - 8 = -4 + 40'b0000_001?_????_????_????_????_????_????_????_????: + result <= #1 6'h3d; // 6 (leading red. bit) - 1 (sign bit) - 8 = -3 + 40'b0000_0001_????_????_????_????_????_????_????_????: + result <= #1 6'h3e; // 7 (leading red. bit) - 1 (sign bit) - 8 = -2 + 40'b0000_0000_1???_????_????_????_????_????_????_????: + result <= #1 6'h3f; // 8 (leading red. bit) - 1 (sign bit) - 8 = -1 + + 40'b0000_0000_01??_????_????_????_????_????_????_????: + result <= #1 6'h00; // 9 (leading red. bit) - 1 (sign bit) - 8 = 0 + 40'b0000_0000_001?_????_????_????_????_????_????_????: + result <= #1 6'h01; //10 (leading red. bit) - 1 (sign bit) - 8 = 1 + 40'b0000_0000_0001_????_????_????_????_????_????_????: + result <= #1 6'h02; //11 (leading red. bit) - 1 (sign bit) - 8 = 2 + 40'b0000_0000_0000_1???_????_????_????_????_????_????: + result <= #1 6'h03; //12 (leading red. bit) - 1 (sign bit) - 8 = 3 + + 40'b0000_0000_0000_01??_????_????_????_????_????_????: + result <= #1 6'h04; //13 (leading red. bit) - 1 (sign bit) - 8 = 4 + 40'b0000_0000_0000_001?_????_????_????_????_????_????: + result <= #1 6'h05; //14 (leading red. bit) - 1 (sign bit) - 8 = 5 + 40'b0000_0000_0000_0001_????_????_????_????_????_????: + result <= #1 6'h06; //15 (leading red. bit) - 1 (sign bit) - 8 = 6 + 40'b0000_0000_0000_0000_1???_????_????_????_????_????: + result <= #1 6'h07; //16 (leading red. bit) - 1 (sign bit) - 8 = 7 + + 40'b0000_0000_0000_0000_01??_????_????_????_????_????: + result <= #1 6'h08; //17 (leading red. bit) - 1 (sign bit) - 8 = 8 + 40'b0000_0000_0000_0000_001?_????_????_????_????_????: + result <= #1 6'h09; //18 (leading red. bit) - 1 (sign bit) - 8 = 9 + 40'b0000_0000_0000_0000_0001_????_????_????_????_????: + result <= #1 6'h0a; //19 (leading red. bit) - 1 (sign bit) - 8 =10 + 40'b0000_0000_0000_0000_0000_1???_????_????_????_????: + result <= #1 6'h0b; //20 (leading red. bit) - 1 (sign bit) - 8 =11 + + 40'b0000_0000_0000_0000_0000_01??_????_????_????_????: + result <= #1 6'h0c; //21 (leading red. bit) - 1 (sign bit) - 8 =12 + 40'b0000_0000_0000_0000_0000_001?_????_????_????_????: + result <= #1 6'h0d; //22 (leading red. bit) - 1 (sign bit) - 8 =13 + 40'b0000_0000_0000_0000_0000_0001_????_????_????_????: + result <= #1 6'h0e; //23 (leading red. bit) - 1 (sign bit) - 8 =14 + 40'b0000_0000_0000_0000_0000_0000_1???_????_????_????: + result <= #1 6'h0f; //24 (leading red. bit) - 1 (sign bit) - 8 =15 + + 40'b0000_0000_0000_0000_0000_0000_01??_????_????_????: + result <= #1 6'h10; //25 (leading red. bit) - 1 (sign bit) - 8 =16 + 40'b0000_0000_0000_0000_0000_0000_001?_????_????_????: + result <= #1 6'h11; //26 (leading red. bit) - 1 (sign bit) - 8 =17 + 40'b0000_0000_0000_0000_0000_0000_0001_????_????_????: + result <= #1 6'h12; //27 (leading red. bit) - 1 (sign bit) - 8 =18 + 40'b0000_0000_0000_0000_0000_0000_0000_1???_????_????: + result <= #1 6'h13; //28 (leading red. bit) - 1 (sign bit) - 8 =19 + + 40'b0000_0000_0000_0000_0000_0000_0000_01??_????_????: + result <= #1 6'h14; //29 (leading red. bit) - 1 (sign bit) - 8 =20 + 40'b0000_0000_0000_0000_0000_0000_0000_001?_????_????: + result <= #1 6'h15; //30 (leading red. bit) - 1 (sign bit) - 8 =21 + 40'b0000_0000_0000_0000_0000_0000_0000_0001_????_????: + result <= #1 6'h16; //31 (leading red. bit) - 1 (sign bit) - 8 =22 + 40'b0000_0000_0000_0000_0000_0000_0000_0000_1???_????: + result <= #1 6'h17; //32 (leading red. bit) - 1 (sign bit) - 8 =23 + + 40'b0000_0000_0000_0000_0000_0000_0000_0000_01??_????: + result <= #1 6'h18; //33 (leading red. bit) - 1 (sign bit) - 8 =24 + 40'b0000_0000_0000_0000_0000_0000_0000_0000_001?_????: + result <= #1 6'h19; //34 (leading red. bit) - 1 (sign bit) - 8 =25 + 40'b0000_0000_0000_0000_0000_0000_0000_0000_0001_????: + result <= #1 6'h1a; //35 (leading red. bit) - 1 (sign bit) - 8 =26 + 40'b0000_0000_0000_0000_0000_0000_0000_0000_0000_1???: + result <= #1 6'h1b; //36 (leading red. bit) - 1 (sign bit) - 8 =27 + + 40'b0000_0000_0000_0000_0000_0000_0000_0000_0000_01??: + result <= #1 6'h1c; //37 (leading red. bit) - 1 (sign bit) - 8 =28 + 40'b0000_0000_0000_0000_0000_0000_0000_0000_0000_001?: + result <= #1 6'h1d; //38 (leading red. bit) - 1 (sign bit) - 8 =29 + 40'b0000_0000_0000_0000_0000_0000_0000_0000_0000_0001: + result <= #1 6'h1e; //39 (leading red. bit) - 1 (sign bit) - 8 =30 + 40'b0000_0000_0000_0000_0000_0000_0000_0000_0000_0000: + result <= #1 6'h1f; //40 (leading red. bit) - 1 (sign bit) - 8 =31 + + // + // negative numbers + // + 40'b10??_????_????_????_????_????_????_????_????_????: + result <= #1 6'h38; // 1 (leading red. bit) - 1 (sign bit) - 8 = -8 + 40'b110?_????_????_????_????_????_????_????_????_????: + result <= #1 6'h39; // 2 (leading red. bit) - 1 (sign bit) - 8 = -7 + 40'b1110_????_????_????_????_????_????_????_????_????: + result <= #1 6'h3a; // 3 (leading red. bit) - 1 (sign bit) - 8 = -6 + 40'b1111_0???_????_????_????_????_????_????_????_????: + result <= #1 6'h3b; // 4 (leading red. bit) - 1 (sign bit) - 8 = -5 + + 40'b1111_10??_????_????_????_????_????_????_????_????: + result <= #1 6'h3c; // 5 (leading red. bit) - 1 (sign bit) - 8 = -4 + 40'b1111_110?_????_????_????_????_????_????_????_????: + result <= #1 6'h3d; // 6 (leading red. bit) - 1 (sign bit) - 8 = -3 + 40'b1111_1110_????_????_????_????_????_????_????_????: + result <= #1 6'h3e; // 7 (leading red. bit) - 1 (sign bit) - 8 = -2 + 40'b1111_1111_0???_????_????_????_????_????_????_????: + result <= #1 6'h3f; // 8 (leading red. bit) - 1 (sign bit) - 8 = -1 + + 40'b1111_1111_10??_????_????_????_????_????_????_????: + result <= #1 6'h00; // 9 (leading red. bit) - 1 (sign bit) - 8 = 0 + 40'b1111_1111_110?_????_????_????_????_????_????_????: + result <= #1 6'h01; //10 (leading red. bit) - 1 (sign bit) - 8 = 1 + 40'b1111_1111_1110_????_????_????_????_????_????_????: + result <= #1 6'h02; //11 (leading red. bit) - 1 (sign bit) - 8 = 2 + 40'b1111_1111_1111_0???_????_????_????_????_????_????: + result <= #1 6'h03; //12 (leading red. bit) - 1 (sign bit) - 8 = 3 + + 40'b1111_1111_1111_10??_????_????_????_????_????_????: + result <= #1 6'h04; //13 (leading red. bit) - 1 (sign bit) - 8 = 4 + 40'b1111_1111_1111_110?_????_????_????_????_????_????: + result <= #1 6'h05; //14 (leading red. bit) - 1 (sign bit) - 8 = 5 + 40'b1111_1111_1111_1110_????_????_????_????_????_????: + result <= #1 6'h06; //15 (leading red. bit) - 1 (sign bit) - 8 = 6 + 40'b1111_1111_1111_1111_0???_????_????_????_????_????: + result <= #1 6'h07; //16 (leading red. bit) - 1 (sign bit) - 8 = 7 + + 40'b1111_1111_1111_1111_10??_????_????_????_????_????: + result <= #1 6'h08; //17 (leading red. bit) - 1 (sign bit) - 8 = 8 + 40'b1111_1111_1111_1111_110?_????_????_????_????_????: + result <= #1 6'h09; //18 (leading red. bit) - 1 (sign bit) - 8 = 9 + 40'b1111_1111_1111_1111_1110_????_????_????_????_????: + result <= #1 6'h0a; //19 (leading red. bit) - 1 (sign bit) - 8 =10 + 40'b1111_1111_1111_1111_1111_0???_????_????_????_????: + result <= #1 6'h0b; //20 (leading red. bit) - 1 (sign bit) - 8 =11 + + 40'b1111_1111_1111_1111_1111_10??_????_????_????_????: + result <= #1 6'h0c; //21 (leading red. bit) - 1 (sign bit) - 8 =12 + 40'b1111_1111_1111_1111_1111_110?_????_????_????_????: + result <= #1 6'h0d; //22 (leading red. bit) - 1 (sign bit) - 8 =13 + 40'b1111_1111_1111_1111_1111_1110_????_????_????_????: + result <= #1 6'h0e; //23 (leading red. bit) - 1 (sign bit) - 8 =14 + 40'b1111_1111_1111_1111_1111_1111_0???_????_????_????: + result <= #1 6'h0f; //24 (leading red. bit) - 1 (sign bit) - 8 =15 + + 40'b1111_1111_1111_1111_1111_1111_10??_????_????_????: + result <= #1 6'h10; //25 (leading red. bit) - 1 (sign bit) - 8 =16 + 40'b1111_1111_1111_1111_1111_1111_110?_????_????_????: + result <= #1 6'h11; //26 (leading red. bit) - 1 (sign bit) - 8 =17 + 40'b1111_1111_1111_1111_1111_1111_1110_????_????_????: + result <= #1 6'h12; //27 (leading red. bit) - 1 (sign bit) - 8 =18 + 40'b1111_1111_1111_1111_1111_1111_1111_0???_????_????: + result <= #1 6'h13; //28 (leading red. bit) - 1 (sign bit) - 8 =19 + + 40'b1111_1111_1111_1111_1111_1111_1111_10??_????_????: + result <= #1 6'h14; //29 (leading red. bit) - 1 (sign bit) - 8 =20 + 40'b1111_1111_1111_1111_1111_1111_1111_110?_????_????: + result <= #1 6'h15; //30 (leading red. bit) - 1 (sign bit) - 8 =21 + 40'b1111_1111_1111_1111_1111_1111_1111_1110_????_????: + result <= #1 6'h16; //31 (leading red. bit) - 1 (sign bit) - 8 =22 + 40'b1111_1111_1111_1111_1111_1111_1111_1111_0???_????: + result <= #1 6'h17; //32 (leading red. bit) - 1 (sign bit) - 8 =23 + + 40'b1111_1111_1111_1111_1111_1111_1111_1111_10??_????: + result <= #1 6'h18; //33 (leading red. bit) - 1 (sign bit) - 8 =24 + 40'b1111_1111_1111_1111_1111_1111_1111_1111_110?_????: + result <= #1 6'h19; //34 (leading red. bit) - 1 (sign bit) - 8 =25 + 40'b1111_1111_1111_1111_1111_1111_1111_1111_1110_????: + result <= #1 6'h1a; //35 (leading red. bit) - 1 (sign bit) - 8 =26 + 40'b1111_1111_1111_1111_1111_1111_1111_1111_1111_0???: + result <= #1 6'h1b; //36 (leading red. bit) - 1 (sign bit) - 8 =27 + + 40'b1111_1111_1111_1111_1111_1111_1111_1111_1111_10??: + result <= #1 6'h1c; //37 (leading red. bit) - 1 (sign bit) - 8 =28 + 40'b1111_1111_1111_1111_1111_1111_1111_1111_1111_110?: + result <= #1 6'h1d; //38 (leading red. bit) - 1 (sign bit) - 8 =29 + 40'b1111_1111_1111_1111_1111_1111_1111_1111_1111_1110: + result <= #1 6'h1e; //39 (leading red. bit) - 1 (sign bit) - 8 =30 + 40'b1111_1111_1111_1111_1111_1111_1111_1111_1111_1111: + result <= #1 6'h1f; //40 (leading red. bit) - 1 (sign bit) - 8 =31 + endcase + +endmodule + Index: oc54x/tags/initial/rtl/verilog/timescale.v =================================================================== --- oc54x/tags/initial/rtl/verilog/timescale.v (nonexistent) +++ oc54x/tags/initial/rtl/verilog/timescale.v (revision 5) @@ -0,0 +1 @@ +`timescale 1ns / 10ps \ No newline at end of file Index: oc54x/tags/initial/rtl/verilog/oc54_cssu.v =================================================================== --- oc54x/tags/initial/rtl/verilog/oc54_cssu.v (nonexistent) +++ oc54x/tags/initial/rtl/verilog/oc54_cssu.v (revision 5) @@ -0,0 +1,122 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, Compare Select and Store Unit (CSSU) //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// +// NOTE: Read the pipeline information for the CMPS instruction +// + +// +// Xilinx Virtex-E WC: 41 CLB slices @ 130MHz +// + +// CVS Log +// +// $Id: oc54_cssu.v,v 1.1.1.1 2002-04-10 09:34:41 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:41 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + +`include "timescale.v" + +module oc54_cssu ( + clk, ena, + sel_acc, is_cssu, + a, b, s, + tco, + trn, result + ); + +// +// parameters +// + +// +// inputs & outputs +// +input clk; +input ena; +input sel_acc; // select input +input is_cssu; // is this a cssu operation ? +input [39:0] a, b, s; // accumulators, shifter input +output tco; // tc-out +output [15:0] trn, result; + +reg tco; +reg [15:0] trn, result; + +// +// variables +// + +wire [31:0] acc; // selected accumulator +wire acc_cmp; // acc[31;16]>acc[15:0] ?? +// +// module body +// + +// +// generate input selection +// + +// input selection +assign acc = sel_acc ? b[31:0] : a[31:0]; + +assign acc_cmp = acc[31:16] > acc[15:0]; + +// result +always@(posedge clk) + if (ena) + begin + if (is_cssu) + if (acc_cmp) + result <= #1 acc[31:16]; + else + result <= #1 acc[15:0]; + else + result <= #1 s[15:0]; + + if (is_cssu) + trn <= #1 {trn[14:0], ~acc_cmp}; + + tco <= #1 ~acc_cmp; + end +endmodule + + Index: oc54x/tags/initial/rtl/verilog/oc54_alu_defines.v =================================================================== --- oc54x/tags/initial/rtl/verilog/oc54_alu_defines.v (nonexistent) +++ oc54x/tags/initial/rtl/verilog/oc54_alu_defines.v (revision 5) @@ -0,0 +1,113 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, ALU defines //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// CVS Log +// +// $Id: oc54_alu_defines.v,v 1.1.1.1 2002-04-10 09:34:40 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:40 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + + +// +// Encoding: bit[6] always zero +// bit[5:4] instuction type +// - 00: (dual) arithmetic +// - 01: logical (incl. shift) +// - 10: bit-test & compare +// - 11: reserved +// Leonardo-Spectrum seems to like the additional zero bit[6] in +// the encoding scheme. It produces the smallest and fastest code +// like this. (Why ???) +// + +// +// arithmetic instructions +// +`define ABS 7'b000_0000 +`define NEG 7'b000_0001 +`define ADD 7'b000_0010 +`define SUB 7'b000_0011 +`define MAX 7'b000_0100 +`define SUBC 7'b000_0101 + +// +// dual arithmetic instructions +// +`define DADD 7'b000_1000 +`define DSUB 7'b000_1100 +`define DRSUB 7'b000_1101 +`define DSUBADD 7'b000_1110 +`define DADDSUB 7'b000_1001 + +// +// logical instructions +// +`define NOT 7'b001_0000 +`define AND 7'b001_0001 +`define OR 7'b001_0010 +`define XOR 7'b001_0011 + +// +// shift instructions +// +`define ROL 7'b001_0100 +`define ROLTC 7'b001_0101 +`define ROR 7'b001_0110 +`define SHFT_CMP 7'b001_0111 + +// +// bit test instructions +// +`define BITF 7'b010_0000 +`define BTST 7'b010_0001 +`define CMP_EQ 7'b010_0100 +`define CMP_LT 7'b010_0101 +`define CMP_GT 7'b010_0110 +`define CMP_NEQ 7'b010_0111 + +// +// condition codes for CMP-test +// +`define EQ 2'b00 +`define LT 2'b01 +`define GT 2'b10 +`define NEQ 2'b11 + Index: oc54x/tags/initial/rtl/verilog/oc54_mac.v =================================================================== --- oc54x/tags/initial/rtl/verilog/oc54_mac.v (nonexistent) +++ oc54x/tags/initial/rtl/verilog/oc54_mac.v (revision 5) @@ -0,0 +1,164 @@ +///////////////////////////////////////////////////////////////////// +//// //// +//// OpenCores54 DSP, MAC //// +//// //// +//// Author: Richard Herveille //// +//// richard@asics.ws //// +//// www.asics.ws //// +//// //// +///////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2002 Richard Herveille //// +//// richard@asics.ws //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +//// //// +//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// +//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// +//// POSSIBILITY OF SUCH DAMAGE. //// +//// //// +///////////////////////////////////////////////////////////////////// + +// +// Xilinx Virtex-E WC: 296 CLB slices @ 64MHz +// + +// CVS Log +// +// $Id: oc54_mac.v,v 1.1.1.1 2002-04-10 09:34:41 rherveille Exp $ +// +// $Date: 2002-04-10 09:34:41 $ +// $Revision: 1.1.1.1 $ +// $Author: rherveille $ +// $Locker: $ +// $State: Exp $ +// +// Change History: +// $Log: not supported by cvs2svn $ + +`include "timescale.v" + +module oc54_mac ( + clk, ena, + a, b, t, p, c, d, + sel_xm, sel_ym, sel_ya, + bp_a, bp_b, bp_ar, bp_br, + xm_s, ym_s, + ovm, frct, smul, add_sub, + result + ); + +// +// parameters +// + +// +// inputs & outputs +// +input clk; +input ena; +input [15:0] t, p, c, d; // TREG, p-bus, c-bus, d-bus inputs +input [39:0] a, b; // accumulator inputs +input [ 1:0] sel_xm, sel_ym, sel_ya; // input selects +input [39:0] bp_ar, bp_br; // bypass accumulator a / b +input bp_a, bp_b; // bypass selects +input xm_s, ym_s; // sign extend xm, ym +input ovm, frct, smul, add_sub; +output [39:0] result; + +reg [39:0] result; + +// +// variables +// +reg [16:0] xm, ym; // multiplier inputs +reg [39:0] ya; // adder Y-input + +reg [33:0] mult_res; // multiplier result +wire [33:0] imult_res; // actual multiplier +reg [39:0] iresult; // mac-result + +///////////////// +// module body // +///////////////// + +// +// generate input selection +// + +// xm +always@(posedge clk) + if (ena) + case(sel_xm) // synopsis full_case parallel_case + 2'b00 : xm <= #1 {xm_s ? t[15] : 1'b0, t}; + 2'b01 : xm <= #1 {xm_s ? d[15] : 1'b0, d}; + 2'b10 : xm <= #1 bp_a ? bp_ar[32:16] : a[32:16]; + 2'b11 : xm <= #1 17'h0; + endcase + +// ym +always@(posedge clk) + if (ena) + case(sel_ym) // synopsis full_case parallel_case + 2'b00 : ym <= #1 {ym_s ? p[15] : 1'b0, p}; + 2'b01 : ym <= #1 bp_a ? bp_ar[32:16] : a[32:16]; + 2'b10 : ym <= #1 {ym_s ? d[15] : 1'b0, d}; + 2'b11 : ym <= #1 {ym_s ? c[15] : 1'b0, c}; + endcase + +// ya +always@(posedge clk) + if (ena) + casex(sel_ya) // synopsis full_case parallel_case + 2'b00 : ya <= #1 bp_a ? bp_ar : a; + 2'b01 : ya <= #1 bp_b ? bp_br : b; + 2'b1? : ya <= #1 40'h0; + endcase + +// +// generate multiplier +// +assign imult_res = (xm * ym); // actual multiplier + +always@(xm or ym or smul or ovm or frct or imult_res) + if (smul && ovm && frct && (xm[15:0] == 16'h8000) && (ym[15:0] == 16'h8000) ) + mult_res = 34'h7ff_ffff; + else if (frct) + mult_res = {imult_res[32:0], 1'b0}; // (imult_res << 1) + else + mult_res = imult_res; + +// +// generate mac-unit +// +always@(mult_res or ya or add_sub) + if (add_sub) + iresult = mult_res + ya; + else + iresult = mult_res - ya; + +// +// generate registers +// + +// result +always@(posedge clk) + if (ena) + result <= #1 iresult; + +endmodule + + Index: oc54x/tags =================================================================== --- oc54x/tags (nonexistent) +++ oc54x/tags (revision 5)
oc54x/tags Property changes : Added: svn:mergeinfo ## -0,0 +0,0 ##

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.