| 1 |
/**********************************************************-*-verilog-*- |
| 2 |
* |
| 3 |
* a stage of DES - ステージ一段 |
| 4 |
* $Id$ |
| 5 |
* |
| 6 |
*/ |
| 7 |
|
| 8 |
module des12(i_l, i_r, i_fk, i_k, |
| 9 |
l, r, k, |
| 10 |
clk5, salt, kp); |
| 11 |
|
| 12 |
input [1:32] i_l; |
| 13 |
input [1:32] i_r; |
| 14 |
input [55:0] i_fk; |
| 15 |
input [55:0] i_k; |
| 16 |
|
| 17 |
output [1:32] l; |
| 18 |
output [1:32] r; |
| 19 |
output [55:0] k; |
| 20 |
|
| 21 |
input clk5; |
| 22 |
input [11:0] salt; |
| 23 |
input [55:0] kp; // phase cache |
| 24 |
|
| 25 |
parameter kmsk = 56'b0000_0000_1111_1111_111_111_111_111_000_000_000_000_000_000_000_000_0000; |
| 26 |
parameter f_ram = 8'b1111_1111; |
| 27 |
parameter krn = 1; |
| 28 |
|
| 29 |
`include "conf.v" |
| 30 |
`include "func_des.v" |
| 31 |
`include "func_salt.v" |
| 32 |
|
| 33 |
// パイプライン用 |
| 34 |
wire [27:0] i_kl, i_kr; |
| 35 |
reg [1:32] ln1, ln2; // ir_p を適用済み |
| 36 |
reg [1:32] r1, r2; |
| 37 |
reg [55:0] k1, k2; |
| 38 |
|
| 39 |
// phase cache |
| 40 |
wire [27:0] kp1, kp0; |
| 41 |
assign {kp1, kp0} = kp; |
| 42 |
|
| 43 |
/* |
| 44 |
* F用 |
| 45 |
* S1-S4は実質鍵固定なので |
| 46 |
* 右側と左側で処理が分かれる |
| 47 |
*/ |
| 48 |
wire [1:48] e; |
| 49 |
reg [1:48] e1, e2; |
| 50 |
reg [1:32] f; |
| 51 |
wire [1:32] ln; |
| 52 |
|
| 53 |
// ROM, RAMの出力 |
| 54 |
wire [1:32] q; |
| 55 |
|
| 56 |
/*************************************************************** |
| 57 |
* |
| 58 |
* stage 1の前処理 |
| 59 |
* e の一部およびlnの一部は、RAMに渡され、 |
| 60 |
* 2クロック後に結果を得られる。 |
| 61 |
*/ |
| 62 |
assign {i_kr, i_kl} = kmux(kmsk, i_fk, i_k); |
| 63 |
assign e = add_salt(salt, tr_e(i_r)) ^ {tr_pc2l(roln(pc1_l(i_kl), krn)), |
| 64 |
tr_pc2r(roln(pc1_r(i_kr), krn))}; |
| 65 |
assign ln = ir_p(i_l); // for RAM |
| 66 |
|
| 67 |
/* |
| 68 |
* STAGE 1 (これと並行して、RAMのAラッチが行われる) |
| 69 |
*/ |
| 70 |
always @(posedge clk5) |
| 71 |
begin |
| 72 |
k1 <= {i_kr, i_kl}; |
| 73 |
ln1 <= ln; |
| 74 |
r1 <= i_r; |
| 75 |
e1 <= e; |
| 76 |
end |
| 77 |
|
| 78 |
/* |
| 79 |
* 必要に応じてRAMから拾う |
| 80 |
* 最終段のXOR演算も一部含まれる |
| 81 |
*/ |
| 82 |
sbrom12 sb_a(clk5, e, ln, ln1, q); |
| 83 |
|
| 84 |
/* |
| 85 |
* STAGE 2 (hold with RAM Q) |
| 86 |
* RAMのQ待ちをするかたわら、LUTを引く |
| 87 |
* key phase cache をここに挿入することにより、 |
| 88 |
* パイプラインレジスタの大幅な削減を図ることができる。 |
| 89 |
*/ |
| 90 |
always @(posedge clk5) |
| 91 |
begin |
| 92 |
//kr2 <= wh01k(kr1); |
| 93 |
k2 <= k1; |
| 94 |
r2 <= r1; |
| 95 |
ln2 <= ln1; |
| 96 |
f <= {s1(e1[ 1: 6]), |
| 97 |
s2(e1[ 7:12]), |
| 98 |
s3(e1[13:18]), |
| 99 |
s4(e1[19:24]), |
| 100 |
s5(e1[25:30]), |
| 101 |
s6(e1[31:36]), |
| 102 |
s7(e1[37:42]), |
| 103 |
s8(e1[43:48])}; |
| 104 |
end |
| 105 |
|
| 106 |
/* |
| 107 |
* (STAGE 3) |
| 108 |
* 最終段はラッチせず、そのまま出力に繋げてある |
| 109 |
* Synthesizerが、次の段の頭と最適化してくれるのを |
| 110 |
* 期待するためである。 |
| 111 |
* |
| 112 |
* 設定によってはこの時点で l2 の特定ビットがマスクされて |
| 113 |
* いるため、マスクされたビットのXORは行われない(ハズ) |
| 114 |
*/ |
| 115 |
assign l = r2; |
| 116 |
assign r = tr_p(rmuxq(f_ram, q, ln2 ^ f)); // 組み合わせの出力だゴメン |
| 117 |
assign k = k2; |
| 118 |
|
| 119 |
/*************************************************************** |
| 120 |
* |
| 121 |
* 出力の振り分け |
| 122 |
* |
| 123 |
*/ |
| 124 |
function [0:31] rmuxq; |
| 125 |
input [7:0] f; |
| 126 |
input [0:31] q1; |
| 127 |
input [0:31] q0; |
| 128 |
rmuxq = {f_ram[0] ? q1[ 0: 3] : q0[ 0: 3], |
| 129 |
f_ram[1] ? q1[ 4: 7] : q0[ 4: 7], |
| 130 |
f_ram[2] ? q1[ 8:11] : q0[ 8:11], |
| 131 |
f_ram[3] ? q1[12:15] : q0[12:15], |
| 132 |
f_ram[4] ? q1[16:19] : q0[16:19], |
| 133 |
f_ram[5] ? q1[20:23] : q0[20:23], |
| 134 |
f_ram[6] ? q1[24:27] : q0[24:27], |
| 135 |
f_ram[7] ? q1[28:31] : q0[28:31]}; |
| 136 |
endfunction |
| 137 |
|
| 138 |
/* |
| 139 |
* 入力より、phaseに応じたキーを合成して返す |
| 140 |
* k, kp は big endian であることに注意。 |
| 141 |
*/ |
| 142 |
function [27:0] wh01k; |
| 143 |
input [27:0] k; |
| 144 |
wh01k = k /*(k[kbn] |
| 145 |
? {kp1[27:kbn + 1], k[kbn:0]} |
| 146 |
: {kp0[27:kbn + 1], k[kbn:0]})*/; |
| 147 |
endfunction |
| 148 |
|
| 149 |
endmodule |
| 150 |
|
| 151 |
/* |
| 152 |
* Local variables: |
| 153 |
* tab-width: 4 |
| 154 |
* End: |
| 155 |
*/ |