Entity: prim_gf_mult
- File: prim_gf_mult.sv
Diagram
Description
Copyright lowRISC contributors. Licensed under the Apache License, Version 2.0, see LICENSE for details. SPDX-License-Identifier: Apache-2.0
This module performs a the multiplication of two operands in Galois field GF(2^Width) modulo the provided irreducible polynomial using a parallel Mastrovito multipler [3]. To cut long paths potentially occurring for large data widths, the implementation provides a parameter StagesPerCycle to decompose the multiplication into Width/StagesPerCycle iterative steps (Digit-Serial/Parallel Multiplier [4]).
Note that this module is not pipelined and produces an output sample every Width/StagesPerCycle cycles.
References:
[1] Patel, "Parallel Multiplier Designs for the Galois/Counter Mode of Operation", https://pdfs.semanticscholar.org/1246/a9ad98dc0421ccfc945e6529c886f23e848d.pdf [2] Wagner, "The Laws of Cryptography: The Finite Field GF(2^8)", http://www.cs.utsa.edu/~wagner/laws/FFM.html
[3]: Mastrovito, "VLSI Designs for Multiplication over Finite Fields GF(2^m)", https://link.springer.com/chapter/10.1007/3-540-51083-4_67 [4]: Song et al., "Efficient Finite Field Serial/Parallel Multiplication", https://ieeexplore.ieee.org/document/542803
Generics
Generic name | Type | Value | Description |
---|---|---|---|
Width | int | 32 | |
StagesPerCycle | int | Width | |
Width | logic[Width-1:0] | 1'b1 << 1 | The field-generating, irreducible polynomial of degree Width. Can for example be a Conway polynomial, see http://www.math.rwth-aachen.de/~Frank.Luebeck/data/ConwayPol/CP2.html For Width = 33, the Conway polynomial hast bits 32, 15, 9, 7, 4, 3, 0 set to one. |
Ports
Port name | Direction | Type | Description |
---|---|---|---|
clk_i | input | ||
rst_ni | input | ||
req_i | input | ||
operand_a_i | input | [Width-1:0] | |
operand_b_i | input | [Width-1:0] | |
ack_o | output | ||
prod_o | output | [Width-1:0] |
Signals
Name | Type | Description |
---|---|---|
reformat_data | logic [Loops-1:0][StagesPerCycle-1:0] | reformat operand_b_i |
op_i_slice | logic [StagesPerCycle-1:0] | this slice of operand bits used during each loop |
matrix | logic [StagesPerCycle-1:0][Width-1:0] | the matrix is made up of a series of GF(2^Width) * x |
vector | logic [Width-1:0] | since the matrix generation is not done in one go, we must remember where it last left off |
cnt | logic [CntWidth-1:0] | this variable tracks which loop we are currently operating |
first | logic | this variable tracks the first loop through the multiply |
prod_q | logic [Width-1:0] | intermediate prod held between loops |
prod_d | logic [Width-1:0] | intermediate prod held between loops |
Constants
Name | Type | Value | Description |
---|---|---|---|
Loops | int | Width / StagesPerCycle | |
CntWidth | int | $clog2(Loops) |
Functions
- gf_mult2 (logic [Width-1:0] operand) return (logic [Width-1:0])
Description
GF(2^Width) * x
- gen_matrix (logic) return (logic [StagesPerCycle-1:0][Width-1:0])
Description
Matrix generate step
- gf_mult (logic [StagesPerCycle-1:0][Width-1) return (logic [Width-1:0])
Description
Galois multiply step