Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
zistvan-public
Caribou KVS with Privacy Perturbations
Commits
7d7db52b
Commit
7d7db52b
authored
Nov 08, 2018
by
Zsolt István
Browse files
PoC of dedup idea
parent
8aac7c42
Changes
13
Expand all
Hide whitespace changes
Inline
Side-by-side
hw/src/muu/muu_ht_write_dedup.v
0 → 100644
View file @
7d7db52b
This diff is collapsed.
Click to expand it.
hw/src/muu/muu_ops.vh
View file @
7d7db52b
...
@@ -49,6 +49,10 @@ localparam [3:0]
...
@@ -49,6 +49,10 @@ localparam [3:0]
HTOP_GETCOND = 8,
HTOP_GETCOND = 8,
HTOP_FLUSH = 4'hF, //(truncated from 8'hFF)
HTOP_FLUSH = 4'hF, //(truncated from 8'hFF)
HTOP_PRE_INCR = 13,
HTOP_PRE_DECR = 14,
// these are not supported:
// these are not supported:
HTOP_SCAN = 9,
HTOP_SCAN = 9,
HTOP_SCANCOND = 10;
HTOP_SCANCOND = 10;
\ No newline at end of file
hw/src/muu/muu_top_module_dedup.v
0 → 100644
View file @
7d7db52b
This diff is collapsed.
Click to expand it.
hw/src/muu/muu_topwrapper.v
View file @
7d7db52b
...
@@ -499,7 +499,7 @@ module muu_TopWrapper #(
...
@@ -499,7 +499,7 @@ module muu_TopWrapper #(
assign
ht_dramWrData_valid
=
syncMode
==
1
?
mem_write_valid
:
ht_dramWrData_valid_r
;
assign
ht_dramWrData_valid
=
syncMode
==
1
?
mem_write_valid
:
ht_dramWrData_valid_r
;
muu_Top_Module_
Repl
muu_Top_Module_
Dedup
#(
#(
.
IS_SIM
(
IS_SIM
),
.
IS_SIM
(
IS_SIM
),
.
USER_BITS
(
USER_BITS
)
.
USER_BITS
(
USER_BITS
)
...
...
hw/src/sha256-master/src/rtl/sha256.v
0 → 100644
View file @
7d7db52b
//======================================================================
//
// sha256.v
// --------
// Top level wrapper for the SHA-256 hash function providing
// a simple memory like interface with 32 bit data access.
//
//
// Author: Joachim Strombergson
// Copyright (c) 2013, 201, Secworks Sweden AB
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
// conditions are met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in
// the documentation and/or other materials provided with the
// distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER 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.
//
//======================================================================
module
sha256
(
// Clock and reset.
input
wire
clk
,
input
wire
reset_n
,
// Control.
input
wire
cs
,
input
wire
we
,
// Data ports.
input
wire
[
7
:
0
]
address
,
input
wire
[
31
:
0
]
write_data
,
output
wire
[
31
:
0
]
read_data
,
output
wire
error
);
//----------------------------------------------------------------
// Internal constant and parameter definitions.
//----------------------------------------------------------------
localparam
ADDR_NAME0
=
8'h00
;
localparam
ADDR_NAME1
=
8'h01
;
localparam
ADDR_VERSION
=
8'h02
;
localparam
ADDR_CTRL
=
8'h08
;
localparam
CTRL_INIT_BIT
=
0
;
localparam
CTRL_NEXT_BIT
=
1
;
localparam
CTRL_MODE_BIT
=
2
;
localparam
ADDR_STATUS
=
8'h09
;
localparam
STATUS_READY_BIT
=
0
;
localparam
STATUS_VALID_BIT
=
1
;
localparam
ADDR_BLOCK0
=
8'h10
;
localparam
ADDR_BLOCK15
=
8'h1f
;
localparam
ADDR_DIGEST0
=
8'h20
;
localparam
ADDR_DIGEST7
=
8'h27
;
localparam
CORE_NAME0
=
32'h73686132
;
// "sha2"
localparam
CORE_NAME1
=
32'h2d323536
;
// "-256"
localparam
CORE_VERSION
=
32'h312e3830
;
// "1.80"
localparam
MODE_SHA_224
=
1'h0
;
localparam
MODE_SHA_256
=
1'h1
;
//----------------------------------------------------------------
// Registers including update variables and write enable.
//----------------------------------------------------------------
reg
init_reg
;
reg
init_new
;
reg
next_reg
;
reg
next_new
;
reg
mode_reg
;
reg
mode_new
;
reg
mode_we
;
reg
ready_reg
;
reg
[
31
:
0
]
block_reg
[
0
:
15
];
reg
block_we
;
reg
[
255
:
0
]
digest_reg
;
reg
digest_valid_reg
;
//----------------------------------------------------------------
// Wires.
//----------------------------------------------------------------
wire
core_ready
;
wire
[
511
:
0
]
core_block
;
wire
[
255
:
0
]
core_digest
;
wire
core_digest_valid
;
reg
[
31
:
0
]
tmp_read_data
;
reg
tmp_error
;
//----------------------------------------------------------------
// Concurrent connectivity for ports etc.
//----------------------------------------------------------------
assign
core_block
=
{
block_reg
[
00
],
block_reg
[
01
],
block_reg
[
02
],
block_reg
[
03
],
block_reg
[
04
],
block_reg
[
05
],
block_reg
[
06
],
block_reg
[
07
],
block_reg
[
08
],
block_reg
[
09
],
block_reg
[
10
],
block_reg
[
11
],
block_reg
[
12
],
block_reg
[
13
],
block_reg
[
14
],
block_reg
[
15
]
}
;
assign
read_data
=
tmp_read_data
;
assign
error
=
tmp_error
;
//----------------------------------------------------------------
// core instantiation.
//----------------------------------------------------------------
sha256_core
core
(
.
clk
(
clk
),
.
reset_n
(
reset_n
),
.
init
(
init_reg
),
.
next
(
next_reg
),
.
mode
(
mode_reg
),
.
block
(
core_block
),
.
ready
(
core_ready
),
.
digest
(
core_digest
),
.
digest_valid
(
core_digest_valid
)
);
//----------------------------------------------------------------
// reg_update
//
// Update functionality for all registers in the core.
// All registers are positive edge triggered with asynchronous
// active low reset. All registers have write enable.
//----------------------------------------------------------------
always
@
(
posedge
clk
or
negedge
reset_n
)
begin
:
reg_update
integer
i
;
if
(
!
reset_n
)
begin
for
(
i
=
0
;
i
<
16
;
i
=
i
+
1
)
block_reg
[
i
]
<=
32'h0
;
init_reg
<=
0
;
next_reg
<=
0
;
ready_reg
<=
0
;
mode_reg
<=
MODE_SHA_256
;
digest_reg
<=
256'h0
;
digest_valid_reg
<=
0
;
end
else
begin
ready_reg
<=
core_ready
;
digest_valid_reg
<=
core_digest_valid
;
init_reg
<=
init_new
;
next_reg
<=
next_new
;
if
(
mode_we
)
mode_reg
<=
mode_new
;
if
(
core_digest_valid
)
digest_reg
<=
core_digest
;
if
(
block_we
)
block_reg
[
address
[
3
:
0
]]
<=
write_data
;
end
end
// reg_update
//----------------------------------------------------------------
// api_logic
//
// Implementation of the api logic. If cs is enabled will either
// try to write to or read from the internal registers.
//----------------------------------------------------------------
always
@*
begin
:
api_logic
init_new
=
0
;
next_new
=
0
;
mode_new
=
0
;
mode_we
=
0
;
block_we
=
0
;
tmp_read_data
=
32'h0
;
tmp_error
=
0
;
if
(
cs
)
begin
if
(
we
)
begin
if
(
address
==
ADDR_CTRL
)
begin
init_new
=
write_data
[
CTRL_INIT_BIT
];
next_new
=
write_data
[
CTRL_NEXT_BIT
];
mode_new
=
write_data
[
CTRL_MODE_BIT
];
mode_we
=
1
;
end
if
((
address
>=
ADDR_BLOCK0
)
&&
(
address
<=
ADDR_BLOCK15
))
block_we
=
1
;
end
// if (we)
else
begin
if
((
address
>=
ADDR_BLOCK0
)
&&
(
address
<=
ADDR_BLOCK15
))
tmp_read_data
=
block_reg
[
address
[
3
:
0
]];
if
((
address
>=
ADDR_DIGEST0
)
&&
(
address
<=
ADDR_DIGEST7
))
tmp_read_data
=
digest_reg
[(
7
-
(
address
-
ADDR_DIGEST0
))
*
32
+:
32
];
case
(
address
)
// Read operations.
ADDR_NAME0:
tmp_read_data
=
CORE_NAME0
;
ADDR_NAME1:
tmp_read_data
=
CORE_NAME1
;
ADDR_VERSION:
tmp_read_data
=
CORE_VERSION
;
ADDR_CTRL:
tmp_read_data
=
{
29'h0
,
mode_reg
,
next_reg
,
init_reg
}
;
ADDR_STATUS:
tmp_read_data
=
{
30'h0
,
digest_valid_reg
,
ready_reg
}
;
default:
begin
end
endcase
// case (address)
end
end
end
// addr_decoder
endmodule
// sha256
//======================================================================
// EOF sha256.v
//======================================================================
hw/src/sha256-master/src/rtl/sha256_core.v
0 → 100644
View file @
7d7db52b
//======================================================================
//
// sha256_core.v
// -------------
// Verilog 2001 implementation of the SHA-256 hash function.
// This is the internal core with wide interfaces.
//
//
// Author: Joachim Strombergson
// Copyright (c) 2013, Secworks Sweden AB
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
// conditions are met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in
// the documentation and/or other materials provided with the
// distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER 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.
//
//======================================================================
module
sha256_core
(
input
wire
clk
,
input
wire
reset_n
,
input
wire
init
,
input
wire
next
,
input
wire
mode
,
input
wire
[
511
:
0
]
block
,
output
wire
ready
,
output
wire
[
255
:
0
]
digest
,
output
wire
digest_valid
);
//----------------------------------------------------------------
// Internal constant and parameter definitions.
//----------------------------------------------------------------
parameter
SHA224_H0_0
=
32'hc1059ed8
;
parameter
SHA224_H0_1
=
32'h367cd507
;
parameter
SHA224_H0_2
=
32'h3070dd17
;
parameter
SHA224_H0_3
=
32'hf70e5939
;
parameter
SHA224_H0_4
=
32'hffc00b31
;
parameter
SHA224_H0_5
=
32'h68581511
;
parameter
SHA224_H0_6
=
32'h64f98fa7
;
parameter
SHA224_H0_7
=
32'hbefa4fa4
;
parameter
SHA256_H0_0
=
32'h6a09e667
;
parameter
SHA256_H0_1
=
32'hbb67ae85
;
parameter
SHA256_H0_2
=
32'h3c6ef372
;
parameter
SHA256_H0_3
=
32'ha54ff53a
;
parameter
SHA256_H0_4
=
32'h510e527f
;
parameter
SHA256_H0_5
=
32'h9b05688c
;
parameter
SHA256_H0_6
=
32'h1f83d9ab
;
parameter
SHA256_H0_7
=
32'h5be0cd19
;
parameter
SHA256_ROUNDS
=
63
;
parameter
CTRL_IDLE
=
0
;
parameter
CTRL_ROUNDS
=
1
;
parameter
CTRL_DONE
=
2
;
//----------------------------------------------------------------
// Registers including update variables and write enable.
//----------------------------------------------------------------
reg
[
31
:
0
]
a_reg
;
reg
[
31
:
0
]
a_new
;
reg
[
31
:
0
]
b_reg
;
reg
[
31
:
0
]
b_new
;
reg
[
31
:
0
]
c_reg
;
reg
[
31
:
0
]
c_new
;
reg
[
31
:
0
]
d_reg
;
reg
[
31
:
0
]
d_new
;
reg
[
31
:
0
]
e_reg
;
reg
[
31
:
0
]
e_new
;
reg
[
31
:
0
]
f_reg
;
reg
[
31
:
0
]
f_new
;
reg
[
31
:
0
]
g_reg
;
reg
[
31
:
0
]
g_new
;
reg
[
31
:
0
]
h_reg
;
reg
[
31
:
0
]
h_new
;
reg
a_h_we
;
reg
[
31
:
0
]
H0_reg
;
reg
[
31
:
0
]
H0_new
;
reg
[
31
:
0
]
H1_reg
;
reg
[
31
:
0
]
H1_new
;
reg
[
31
:
0
]
H2_reg
;
reg
[
31
:
0
]
H2_new
;
reg
[
31
:
0
]
H3_reg
;
reg
[
31
:
0
]
H3_new
;
reg
[
31
:
0
]
H4_reg
;
reg
[
31
:
0
]
H4_new
;
reg
[
31
:
0
]
H5_reg
;
reg
[
31
:
0
]
H5_new
;
reg
[
31
:
0
]
H6_reg
;
reg
[
31
:
0
]
H6_new
;
reg
[
31
:
0
]
H7_reg
;
reg
[
31
:
0
]
H7_new
;
reg
H_we
;
reg
[
5
:
0
]
t_ctr_reg
;
reg
[
5
:
0
]
t_ctr_new
;
reg
t_ctr_we
;
reg
t_ctr_inc
;
reg
t_ctr_rst
;
reg
digest_valid_reg
;
reg
digest_valid_new
;
reg
digest_valid_we
;
reg
[
1
:
0
]
sha256_ctrl_reg
;
reg
[
1
:
0
]
sha256_ctrl_new
;
reg
sha256_ctrl_we
;
//----------------------------------------------------------------
// Wires.
//----------------------------------------------------------------
reg
digest_init
;
reg
digest_update
;
reg
state_init
;
reg
state_update
;
reg
first_block
;
reg
ready_flag
;
reg
[
31
:
0
]
t1
;
reg
[
31
:
0
]
t2
;
wire
[
31
:
0
]
k_data
;
reg
w_init
;
reg
w_next
;
wire
[
31
:
0
]
w_data
;
//----------------------------------------------------------------
// Module instantiantions.
//----------------------------------------------------------------
sha256_k_constants
k_constants_inst
(
.
addr
(
t_ctr_reg
),
.
K
(
k_data
)
);
sha256_w_mem
w_mem_inst
(
.
clk
(
clk
),
.
reset_n
(
reset_n
),
.
block
(
block
),
.
init
(
w_init
),
.
next
(
w_next
),
.
w
(
w_data
)
);
//----------------------------------------------------------------
// Concurrent connectivity for ports etc.
//----------------------------------------------------------------
assign
ready
=
ready_flag
;
assign
digest
=
{
H0_reg
,
H1_reg
,
H2_reg
,
H3_reg
,
H4_reg
,
H5_reg
,
H6_reg
,
H7_reg
}
;
assign
digest_valid
=
digest_valid_reg
;
//----------------------------------------------------------------
// reg_update
// Update functionality for all registers in the core.
// All registers are positive edge triggered with asynchronous
// active low reset. All registers have write enable.
//----------------------------------------------------------------
always
@
(
posedge
clk
or
negedge
reset_n
)
begin
:
reg_update
if
(
!
reset_n
)
begin
a_reg
<=
32'h0
;
b_reg
<=
32'h0
;
c_reg
<=
32'h0
;
d_reg
<=
32'h0
;
e_reg
<=
32'h0
;
f_reg
<=
32'h0
;
g_reg
<=
32'h0
;
h_reg
<=
32'h0
;
H0_reg
<=
32'h0
;
H1_reg
<=
32'h0
;
H2_reg
<=
32'h0
;
H3_reg
<=
32'h0
;
H4_reg
<=
32'h0
;
H5_reg
<=
32'h0
;
H6_reg
<=
32'h0
;
H7_reg
<=
32'h0
;
digest_valid_reg
<=
0
;
t_ctr_reg
<=
6'h0
;
sha256_ctrl_reg
<=
CTRL_IDLE
;
end
else
begin
if
(
a_h_we
)
begin
a_reg
<=
a_new
;
b_reg
<=
b_new
;
c_reg
<=
c_new
;
d_reg
<=
d_new
;
e_reg
<=
e_new
;
f_reg
<=
f_new
;
g_reg
<=
g_new
;
h_reg
<=
h_new
;
end
if
(
H_we
)
begin
H0_reg
<=
H0_new
;
H1_reg
<=
H1_new
;
H2_reg
<=
H2_new
;
H3_reg
<=
H3_new
;
H4_reg
<=
H4_new
;
H5_reg
<=
H5_new
;
H6_reg
<=
H6_new
;
H7_reg
<=
H7_new
;
end
if
(
t_ctr_we
)
t_ctr_reg
<=
t_ctr_new
;
if
(
digest_valid_we
)
digest_valid_reg
<=
digest_valid_new
;
if
(
sha256_ctrl_we
)
sha256_ctrl_reg
<=
sha256_ctrl_new
;
end
end
// reg_update
//----------------------------------------------------------------
// digest_logic
//
// The logic needed to init as well as update the digest.
//----------------------------------------------------------------
always
@*
begin
:
digest_logic
H0_new
=
32'h0
;
H1_new
=
32'h0
;
H2_new
=
32'h0
;
H3_new
=
32'h0
;
H4_new
=
32'h0
;
H5_new
=
32'h0
;
H6_new
=
32'h0
;
H7_new
=
32'h0
;
H_we
=
0
;
if
(
digest_init
)
begin
H_we
=
1
;
if
(
mode
)
begin
H0_new
=
SHA256_H0_0
;
H1_new
=
SHA256_H0_1
;
H2_new
=
SHA256_H0_2
;
H3_new
=
SHA256_H0_3
;
H4_new
=
SHA256_H0_4
;
H5_new
=
SHA256_H0_5
;
H6_new
=
SHA256_H0_6
;
H7_new
=
SHA256_H0_7
;
end
else
begin
H0_new
=
SHA224_H0_0
;
H1_new
=
SHA224_H0_1
;
H2_new
=
SHA224_H0_2
;
H3_new
=
SHA224_H0_3
;
H4_new
=
SHA224_H0_4
;
H5_new
=
SHA224_H0_5
;
H6_new
=
SHA224_H0_6
;
H7_new
=
SHA224_H0_7
;
end
end
if
(
digest_update
)
begin
H0_new
=
H0_reg
+
a_reg
;
H1_new
=
H1_reg
+
b_reg
;
H2_new
=
H2_reg
+
c_reg
;
H3_new
=
H3_reg
+
d_reg
;
H4_new
=
H4_reg
+
e_reg
;
H5_new
=
H5_reg
+
f_reg
;
H6_new
=
H6_reg
+
g_reg
;
H7_new
=
H7_reg
+
h_reg
;
H_we
=
1
;
end
end
// digest_logic
//----------------------------------------------------------------