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

Subversion Repositories v586

[/] [v586/] [trunk/] [core_rtl/] [synthetic_op.v] - Blame information for rev 121

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 121 ultro
/* verilator lint_off UNUSED */
2
/* verilator lint_off CASEX */
3
module synthetic_op ( clk , sel, opa32, opb32 , res64 );
4
 
5
input clk;
6
input [2:0] sel;
7
input [31:0] opa32,opb32;
8
 
9
output        [63:0]  res64;
10
 
11
wire signed [31:0] sopa32,sopb32;
12
wire        [31:0] uopa32,uopb32;
13
wire        [31:0] aopa32,aopb32;
14
wire        [63:0] out_abs;
15
reg         [47:0] unsign_st1a, unsign_st1b;
16
reg         [ 2:0] pipe1,pipe2;
17
reg         [31:0] pipea,pipeb;
18
 
19
// cast
20
assign sopa32 = (sel[1:0] == 2'b10) ? opa32 :
21
                (sel[1:0] == 2'b01) ? {{16{opa32[15]}},opa32[15:0]}:
22
                                      {{24{opa32[7]}},opa32[ 7:0]};
23
 
24
assign sopb32 = (sel[1:0] == 2'b10) ? opb32 :
25
                (sel[1:0] == 2'b01) ? {{16{opb32[15]}},opb32[15:0]}:
26
                                      {{24{opb32[7]}},opb32[ 7:0]};
27
 
28
assign uopa32 = (sel[1:0] == 2'b10) ? opa32 :
29
                (sel[1:0] == 2'b01) ? {16'b0,opa32[15:0]}:
30
                                      {24'b0,opa32[ 7:0]};
31
 
32
assign uopb32 = (sel[1:0] == 2'b10) ? opb32 :
33
                (sel[1:0] == 2'b01) ? {16'b0,opb32[15:0]}:
34
                                      {24'b0,opb32[ 7:0]};
35
 
36
// absolute value if needed
37
assign aopa32 = ({sel[2],sopa32[31]} == 2'b11 ) ? ( ~sopa32 + 1 ) : uopa32;
38
assign aopb32 = ({sel[2],sopb32[31]} == 2'b11 ) ? ( ~sopb32 + 1 ) : uopb32;
39
 
40
 
41
 
42
// stage 1
43
always @(posedge clk)
44
begin
45
 pipea <= aopa32;
46
 pipeb <= aopb32;
47
 pipe1 <= {sel[2],sopa32[31],sopb32[31]};
48
end
49
 
50
// stage 2
51
always @(posedge clk)
52
begin
53
 unsign_st1a <= pipea * pipeb[15:0];
54
 unsign_st1b <= pipea * pipeb[31:16];
55
 pipe2 <= pipe1;
56
end
57
 
58
 
59
// output
60
assign out_abs  = {16'b0,unsign_st1a} + {unsign_st1b,16'b0};
61
 
62
assign res64 = (( pipe2 == 3'b110 ) || ( pipe2 == 3'b101 )) ? ~out_abs + 1 : out_abs;
63
 
64
endmodule

powered by: WebSVN 2.1.0

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