Sun, 06 Mar 2011 21:03:32 +0000
Commit GSI patches from Wesley Terpstra
- Add JTAG capture pin
==> allows removing sensitivity to reg_update which caused clocking problems making JTAG unstable
- Use register file backed by RAM blocks
==> saves quite some area and speed on altera
... be sure to enable it using `define CFG_EBR_POSEDGE_REGISTER_FILE
- Fix a minor problem where compilation fails when interrupts are not supported
- Add support to flush icache and dcache per JTAG
- Fix wrong width assignments for PC
Multiplier patch has been left out for now; don't the design synthesizers (Quartus / Xst) split the multiply automatically?
Original-Author: Wesley Terpstra <w.terpsta gsi.de>
Original-Source: Milkymist mailing list postings, 2011-02-28 (11:19 and 13:32) and 2011-03-01
Original-Message-Ids: <4D6B84B5.9040604@gsi.de> <4D6BA3E4.3020609@gsi.de> <4D6CFFF2.6030703@gsi.de>
1 // =============================================================================
2 // COPYRIGHT NOTICE
3 // Copyright 2006 (c) Lattice Semiconductor Corporation
4 // ALL RIGHTS RESERVED
5 // This confidential and proprietary software may be used only as authorised by
6 // a licensing agreement from Lattice Semiconductor Corporation.
7 // The entire notice above must be reproduced on all authorized copies and
8 // copies may only be made to the extent permitted by a licensing agreement from
9 // Lattice Semiconductor Corporation.
10 //
11 // Lattice Semiconductor Corporation TEL : 1-800-Lattice (USA and Canada)
12 // 5555 NE Moore Court 408-826-6000 (other locations)
13 // Hillsboro, OR 97124 web : http://www.latticesemi.com/
14 // U.S.A email: techsupport@latticesemi.com
15 // ============================================================================/
16 // FILE DETAILS
17 // Project : LatticeMico32
18 // File : lm32_adder.v
19 // Title : Integer adder / subtractor with comparison flag generation
20 // Dependencies : lm32_include.v
21 // Version : 6.1.17
22 // : Initial Release
23 // Version : 7.0SP2, 3.0
24 // : No Change
25 // Version : 3.1
26 // : No Change
27 // =============================================================================
29 `include "lm32_include.v"
31 /////////////////////////////////////////////////////
32 // Module interface
33 /////////////////////////////////////////////////////
35 module lm32_adder (
36 // ----- Inputs -------
37 adder_op_x,
38 adder_op_x_n,
39 operand_0_x,
40 operand_1_x,
41 // ----- Outputs -------
42 adder_result_x,
43 adder_carry_n_x,
44 adder_overflow_x
45 );
47 /////////////////////////////////////////////////////
48 // Inputs
49 /////////////////////////////////////////////////////
51 input adder_op_x; // Operating to perform, 0 for addition, 1 for subtraction
52 input adder_op_x_n; // Inverted version of adder_op_x
53 input [`LM32_WORD_RNG] operand_0_x; // Operand to add, or subtract from
54 input [`LM32_WORD_RNG] operand_1_x; // Opearnd to add, or subtract by
56 /////////////////////////////////////////////////////
57 // Outputs
58 /////////////////////////////////////////////////////
60 output [`LM32_WORD_RNG] adder_result_x; // Result of addition or subtraction
61 wire [`LM32_WORD_RNG] adder_result_x;
62 output adder_carry_n_x; // Inverted carry
63 wire adder_carry_n_x;
64 output adder_overflow_x; // Indicates if overflow occured, only valid for subtractions
65 reg adder_overflow_x;
67 /////////////////////////////////////////////////////
68 // Internal nets and registers
69 /////////////////////////////////////////////////////
71 wire a_sign; // Sign (i.e. positive or negative) of operand 0
72 wire b_sign; // Sign of operand 1
73 wire result_sign; // Sign of result
75 /////////////////////////////////////////////////////
76 // Instantiations
77 /////////////////////////////////////////////////////
79 lm32_addsub addsub (
80 // ----- Inputs -----
81 .DataA (operand_0_x),
82 .DataB (operand_1_x),
83 .Cin (adder_op_x),
84 .Add_Sub (adder_op_x_n),
85 // ----- Ouputs -----
86 .Result (adder_result_x),
87 .Cout (adder_carry_n_x)
88 );
90 /////////////////////////////////////////////////////
91 // Combinational Logic
92 /////////////////////////////////////////////////////
94 // Extract signs of operands and result
96 assign a_sign = operand_0_x[`LM32_WORD_WIDTH-1];
97 assign b_sign = operand_1_x[`LM32_WORD_WIDTH-1];
98 assign result_sign = adder_result_x[`LM32_WORD_WIDTH-1];
100 // Determine whether an overflow occured when performing a subtraction
102 always @(*)
103 begin
104 // +ve - -ve = -ve -> overflow
105 // -ve - +ve = +ve -> overflow
106 if ( (!a_sign & b_sign & result_sign)
107 || (a_sign & !b_sign & !result_sign)
108 )
109 adder_overflow_x = `TRUE;
110 else
111 adder_overflow_x = `FALSE;
112 end
114 endmodule