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

Subversion Repositories apbtoaes128

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /apbtoaes128
    from Rev 4 to Rev 5
    Reverse comparison

Rev 4 → Rev 5

/trunk/pli/aes_init.h
72,7 → 72,6
////
////
///////////////////////////////////////////////////////////////////
 
static int init_calltf(char*user_data)
{
 
/trunk/pli/env_aes.c
163,15 → 163,15
#define AES_WR_ERROR_DOUTR_ONLY 100
 
/*TEST USING NAMES TO ENABLE BFMs*/
#define ECB_ENCRYPTION 1
#define ECB_DECRYPTION 2
#define ECB_KEY_GEN 3
#define ECB_DERIVATION_DECRYPTION 4
#define ECB_ENCRYPTION 1
#define ECB_DECRYPTION 2
#define ECB_KEY_GEN 3
#define ECB_DERIVATION_DECRYPTION 4
 
#define ECB_ENCRYPTION_DMA 5
#define ECB_DECRYPTION_DMA 6
#define ECB_KEY_GEN_DMA 7
#define ECB_DERIVATION_DECRYPTION_DMA 8
#define ECB_ENCRYPTION_DMA 5
#define ECB_DECRYPTION_DMA 6
#define ECB_KEY_GEN_DMA 7
#define ECB_DERIVATION_DECRYPTION_DMA 8
 
#define ECB_ENCRYPTION_CCFIE 9
#define ECB_DECRYPTION_CCFIE 10
178,6 → 178,39
#define ECB_DERIVATION_DECRYPTION_CCFIE 11
#define ECB_KEY_GEN_CCFIE 12
 
/*TEST USING CBC*/
 
#define CBC_ENCRYPTION 13
#define CBC_DECRYPTION 14
#define CBC_KEY_GEN 15
#define CBC_DERIVATION_DECRYPTION 16
 
#define CBC_ENCRYPTION_DMA 17
#define CBC_DECRYPTION_DMA 18
#define CBC_KEY_GEN_DMA 19
#define CBC_DERIVATION_DECRYPTION_DMA 20
 
#define CBC_ENCRYPTION_CCFIE 21
#define CBC_DECRYPTION_CCFIE 22
#define CBC_DERIVATION_DECRYPTION_CCFIE 23
#define CBC_KEY_GEN_CCFIE 24
 
/*TEST USING CTR*/
#define CTR_ENCRYPTION 25
#define CTR_DECRYPTION 26
#define CTR_KEY_GEN 27
#define CTR_DERIVATION_DECRYPTION 28
 
#define CTR_ENCRYPTION_DMA 29
#define CTR_DECRYPTION_DMA 30
#define CTR_KEY_GEN_DMA 31
#define CTR_DERIVATION_DECRYPTION_DMA 32
 
#define CTR_ENCRYPTION_CCFIE 33
#define CTR_DECRYPTION_CCFIE 34
#define CTR_DERIVATION_DECRYPTION_CCFIE 35
#define CTR_KEY_GEN_CCFIE 36
 
/*TYPE CONFIGURATION USED TO INSERT DATA ON DUT*/
#define FIPS 0
#define RANDOM_DATA 1
196,6 → 229,21
unsigned char TEXT_FIPS_DERIVATED[] = {0x69,0xC4,0xE0,0xD8,0x6A,0x7B,0x04,0x30,0xD8,0xCD,0xB7,0x80,0x70,0xB4,0xC5,0x5A};
unsigned char KEY_FIPS_DERIVATED[] = {0x13,0x11,0x1D,0x7F,0xE3,0x94,0x4A,0x17,0xF3,0x07,0xA7,0x8B,0x4D,0x2B,0x30,0xC5};
 
 
unsigned char KEY_FIPS_CBC_NOT_DERIVATED[] = {0x2B,0x7E,0x15,0x16,0x28,0xAE,0xD2,0xA6,0xAB,0xF7,0x15,0x88,0x09,0xCF,0x4F,0x3C};
unsigned char IV_FIPS_CBC_NOT_DERIVATED[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};
unsigned char TEXT_FIPS_CBC_NOT_DERIVATED[] = {0x6B,0xC1,0xBE,0xE2,0x2E,0x40,0x9F,0x96,0xE9,0x3D,0x7E,0x11,0x73,0x93,0x17,0x2A};
 
 
unsigned char TEXT_CBC_FIPS_DERIVATED[] = {0x76,0x49,0xAB,0xAC,0x81,0x19,0xB2,0x46,0xCE,0xE9,0x8E,0x9B,0x12,0xE9,0x19,0x7D};
 
 
unsigned char KEY_FIPS_CTR_NOT_DERIVATED[] = {0x2B,0x7E,0x15,0x16,0x28,0xAE,0xD2,0xA6,0xAB,0xF7,0x15,0x88,0x09,0xCF,0x4F,0x3C};
unsigned char IV_FIPS_CTR_NOT_DERIVATED[] = {0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF};
unsigned char TEXT_FIPS_CTR_NOT_DERIVATED[] = {0x6B,0xC1,0xBE,0xE2,0x2E,0x40,0x9F,0x96,0xE9,0x3D,0x7E,0x11,0x73,0x93,0x17,0x2A};
 
unsigned char TEXT_CTR_FIPS_DERIVATED[] = {0x87,0x4D,0x61,0x91,0xB6,0x20,0xE3,0x26,0x1B,0xEF,0x68,0x64,0x99,0x0D,0xB6,0xCE};
 
/*BFM CONTROL FLOW*/
#include "aes_bfm_generate.h"
 
215,12 → 263,46
#include "bfm_ecb/aes_bfm_key_generation_dma_ecb.h"
#include "bfm_ecb/aes_bfm_derivation_decryption_dma_ecb.h"
 
 
#include "bfm_ecb/aes_bfm_encryption_ccfie_ecb.h"
#include "bfm_ecb/aes_bfm_decryption_ccfie_ecb.h"
#include "bfm_ecb/aes_bfm_derivation_decryption_ccfie_ecb.h"
#include "bfm_ecb/aes_bfm_key_generation_ccfie_ecb.h"
 
/*CBC TEST CASES*/
 
#include "bfm_cbc/aes_bfm_encryption_cbc.h"
#include "bfm_cbc/aes_bfm_decryption_cbc.h"
#include "bfm_cbc/aes_bfm_derivation_decryption_cbc.h"
#include "bfm_cbc/aes_bfm_key_generation_cbc.h"
 
#include "bfm_cbc/aes_bfm_encryption_dma_cbc.h"
#include "bfm_cbc/aes_bfm_decryption_dma_cbc.h"
#include "bfm_cbc/aes_bfm_derivation_decryption_dma_cbc.h"
#include "bfm_cbc/aes_bfm_key_generation_dma_cbc.h"
 
#include "bfm_cbc/aes_bfm_encryption_ccfie_cbc.h"
#include "bfm_cbc/aes_bfm_decryption_ccfie_cbc.h"
#include "bfm_cbc/aes_bfm_derivation_decryption_ccfie_cbc.h"
#include "bfm_cbc/aes_bfm_key_generation_ccfie_cbc.h"
 
/*CTR TEST CASES*/
 
#include "bfm_ctr/aes_bfm_encryption_ctr.h"
#include "bfm_ctr/aes_bfm_decryption_ctr.h"
#include "bfm_ctr/aes_bfm_key_generation_ctr.h"
#include "bfm_ctr/aes_bfm_derivation_decryption_ctr.h"
 
#include "bfm_ctr/aes_bfm_encryption_dma_ctr.h"
#include "bfm_ctr/aes_bfm_decryption_dma_ctr.h"
#include "bfm_ctr/aes_bfm_key_generation_dma_ctr.h"
#include "bfm_ctr/aes_bfm_derivation_decryption_dma_ctr.h"
 
#include "bfm_ctr/aes_bfm_encryption_ccfie_ctr.h"
#include "bfm_ctr/aes_bfm_decryption_ccfie_ctr.h"
#include "bfm_ctr/aes_bfm_key_generation_ccfie_ctr.h"
#include "bfm_ctr/aes_bfm_derivation_decryption_ccfie_ctr.h"
 
/*ENV CONFIG */
#include "aes_init.h"
#include "aes_monitor.h"
#include "aes_bfm_reset.h"
270,7 → 352,7
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
// ENCRYPTION
//ECB ENCRYPTION
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_encryption_ecb_aes128";
298,9 → 380,65
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
//DECRYPTION
//CBC ENCRYPTION
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_encryption_cbc_aes128";
tf_data.calltf = aes_bfm_encryption_cbc_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_encryption_cbc_dma_aes128";
tf_data.calltf = aes_bfm_encryption_cbc_dma_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_encryption_ccfie_cbc_aes128";
tf_data.calltf = aes_bfm_encryption_ccfie_cbc_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
//CTR ENCRYPTION
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_encryption_ctr_aes128";
tf_data.calltf = aes_bfm_encryption_ctr_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_encryption_ctr_dma_aes128";
tf_data.calltf = aes_bfm_encryption_ctr_dma_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_encryption_ccfie_ctr_aes128";
tf_data.calltf = aes_bfm_encryption_ccfie_ctr_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
//ECB DECRYPTION
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_decryption_ecb_aes128";
tf_data.calltf = aes_bfm_decryption_ecb_calltf;
tf_data.compiletf = 0;
326,9 → 464,65
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
//DERIVATION DECRYPTION
//CBC DECRYPTION
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_decryption_cbc_aes128";
tf_data.calltf = aes_bfm_decryption_cbc_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_decryption_cbc_dma_aes128";
tf_data.calltf = aes_bfm_decryption_cbc_dma_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_decryption_ccfie_cbc_aes128";
tf_data.calltf = aes_bfm_decryption_ccfie_cbc_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
//CTR DECRYPTION
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_decryption_ctr_aes128";
tf_data.calltf = aes_bfm_decryption_ctr_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_decryption_ctr_dma_aes128";
tf_data.calltf = aes_bfm_decryption_ctr_dma_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_decryption_ccfie_ctr_aes128";
tf_data.calltf = aes_bfm_decryption_ccfie_ctr_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
//ECB DERIVATION DECRYPTION
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_derivation_decryption_ecb_aes128";
tf_data.calltf = aes_bfm_derivation_decryption_ecb_calltf;
tf_data.compiletf = 0;
354,6 → 548,63
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
//CBC DERIVATION DECRYPTION
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_derivation_decryption_cbc_aes128";
tf_data.calltf = aes_bfm_derivation_decryption_cbc_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_derivation_decryption_dma_cbc_aes128";
tf_data.calltf = aes_bfm_derivation_decryption_dma_cbc_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_derivation_decryption_ccfie_cbc_aes128";
tf_data.calltf = aes_bfm_derivation_decryption_ccfie_cbc_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
//CTR DERIVATION DECRYPTION
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_derivation_decryption_ctr_aes128";
tf_data.calltf = aes_bfm_derivation_decryption_ctr_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_derivation_decryption_dma_ctr_aes128";
tf_data.calltf = aes_bfm_derivation_decryption_dma_ctr_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_derivation_decryption_ccfie_ctr_aes128";
tf_data.calltf = aes_bfm_derivation_decryption_ccfie_ctr_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
 
//KEY DERIVATION
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
383,6 → 634,62
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
//CBC DERIVATION
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_key_generation_cbc_aes128";
tf_data.calltf = aes_bfm_key_generation_cbc_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_key_generation_dma_cbc_aes128";
tf_data.calltf = aes_bfm_key_generation_dma_cbc_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_key_generation_ccfie_cbc_aes128";
tf_data.calltf = aes_bfm_key_generation_ccfie_cbc_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
//CTR DERIVATION
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_key_generation_ctr_aes128";
tf_data.calltf = aes_bfm_key_generation_ctr_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_key_generation_dma_ctr_aes128";
tf_data.calltf = aes_bfm_key_generation_dma_ctr_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
tf_data.tfname = "$bfm_key_generation_ccfie_ctr_aes128";
tf_data.calltf = aes_bfm_key_generation_ccfie_ctr_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
tf_data.user_data = 0;
vpi_register_systf(&tf_data);
 
// RESET BFM
tf_data.type = vpiSysTask;
tf_data.sysfunctype = 0;
/trunk/pli/aes_init_reset.h
72,7 → 72,6
////
////
///////////////////////////////////////////////////////////////////
 
static int init_reset_calltf(char*user_data)
{
 
/trunk/pli/bfm_cbc/aes_bfm_decryption_ccfie_cbc.h
0,0 → 1,612
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_decryption_ccfie_cbc_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CBC_DECRYPTION_CCFIE && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
 
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 561;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
 
if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_CBC_FIPS_DERIVATED[0];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[1];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[2];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_CBC_FIPS_DERIVATED[4];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[5];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[6];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_CBC_FIPS_DERIVATED[8];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[9];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[10];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_CBC_FIPS_DERIVATED[12];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[13];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[14];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[15];
v_ecb.value.integer = d;
 
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
 
}
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 14)
{
counter_write = 0;
 
STATE =WAIT_SR;
 
 
 
 
 
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_read == 12)
{
STATE = RESET_SR;
counter_read = 0;
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_cbc/aes_bfm_encryption_cbc.h
0,0 → 1,605
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_encryption_cbc_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CBC_ENCRYPTION && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
 
 
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
 
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
 
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
}else if(counter_write == 9)//ENABLE CR
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 33;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}else if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
 
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
 
}
counter=0;
 
}
 
 
 
if(counter_write == 14)
{
counter_write = 0;
STATE = WAIT_SR;
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 10;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_read == 12)
{
STATE = RESET_SR;
counter_read = 0;
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
 
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_cbc/aes_bfm_encryption_dma_cbc.h
0,0 → 1,611
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_encryption_cbc_dma_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CBC_ENCRYPTION_DMA && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
 
 
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
 
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
 
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
//vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
}else if(counter_write == 9)//ENABLE CR
{
 
v_ecb.value.integer = ADDR_AES_CR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
//v_ecb.value.integer = 1;
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 6177;//data_in(rd);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}else if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
 
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
 
}
counter=0;
 
}
 
 
 
if(counter_write == 14)
{
counter_write = 0;
STATE = WAIT_SR;
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 10;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_read == 12)
{
STATE = RESET_SR;
counter_read = 0;
}
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
 
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_cbc/aes_bfm_key_generation_ccfie_cbc.h
0,0 → 1,521
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_key_generation_ccfie_cbc_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CBC_KEY_GEN_CCFIE && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
 
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
 
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 297;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 10)
{
counter_write = 0;
counter_read = 0;
 
STATE =WAIT_SR;
 
 
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_KEY_GEN;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 10;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_KEY_GEN:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
 
if(counter_read == 0)
{
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 1)
{
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 2)
{
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
if(counter_read == 3)
{
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter = 0;
}
 
if(counter_read == 8)
{
STATE = RESET_SR;
counter_write = 0;
counter_read = 0;
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_cbc/aes_bfm_derivation_decryption_ccfie_cbc.h
0,0 → 1,579
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_derivation_decryption_ccfie_cbc_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CBC_DERIVATION_DECRYPTION_CCFIE && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
//ENABLE CR
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 569;//data_in(rd);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
//WRITE DINR
if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_CBC_FIPS_DERIVATED[0];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[1];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[2];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_CBC_FIPS_DERIVATED[4];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[5];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[6];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_CBC_FIPS_DERIVATED[8];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[9];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[10];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_CBC_FIPS_DERIVATED[12];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[13];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[14];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
 
}
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 14)
{
counter_write = 0;
 
STATE =WAIT_SR;
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
if(counter_read < 4)
{
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 4)
{
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 5)
{
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
 
if(counter_read == 6)
{
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 7)
{
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
if(counter_read == 8)
{
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 9)
{
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 10)
{
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 11)
{
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
counter = 0;
}
 
if(counter_read == 12 )
{
STATE = RESET_SR;
counter_read = 0;
counter_write = 0;
 
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_cbc/aes_bfm_decryption_cbc.h
0,0 → 1,606
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_decryption_cbc_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CBC_DECRYPTION && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
 
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 49;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
 
if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_CBC_FIPS_DERIVATED[0];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[1];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[2];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_CBC_FIPS_DERIVATED[4];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[5];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[6];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_CBC_FIPS_DERIVATED[8];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[9];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[10];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_CBC_FIPS_DERIVATED[12];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[13];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[14];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[15];
v_ecb.value.integer = d;
 
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
}
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 14)
{
counter_write = 0;
 
STATE =WAIT_SR;
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_read == 12)
{
STATE = RESET_SR;
counter_read = 0;
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_cbc/aes_bfm_decryption_dma_cbc.h
0,0 → 1,613
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_decryption_cbc_dma_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CBC_DECRYPTION_DMA && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
 
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 6193;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
 
if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_CBC_FIPS_DERIVATED[0];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[1];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[2];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_CBC_FIPS_DERIVATED[4];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[5];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[6];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_CBC_FIPS_DERIVATED[8];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[9];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[10];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_CBC_FIPS_DERIVATED[12];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[13];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[14];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[15];
v_ecb.value.integer = d;
 
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
 
}
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 14)
{
counter_write = 0;
 
STATE =WAIT_SR;
 
 
 
 
 
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_read == 12)
{
STATE = RESET_SR;
counter_read = 0;
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_cbc/aes_bfm_encryption_ccfie_cbc.h
0,0 → 1,603
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_encryption_ccfie_cbc_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CBC_ENCRYPTION_CCFIE && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
 
 
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
 
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
 
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
}else if(counter_write == 9)//ENABLE CR
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 545;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}else if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | TEXT_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | TEXT_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | TEXT_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | TEXT_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
 
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
 
}
counter=0;
 
}
 
 
 
if(counter_write == 14)
{
counter_write = 0;
STATE = WAIT_SR;
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 10;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_read == 12)
{
STATE = RESET_SR;
counter_read = 0;
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
 
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_cbc/aes_bfm_key_generation_cbc.h
0,0 → 1,510
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_key_generation_cbc_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CBC_KEY_GEN && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
 
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 41;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 10)
{
counter_write = 0;
counter_read = 0;
 
STATE =WAIT_SR;
 
 
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_KEY_GEN;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 10;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_KEY_GEN:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
if(counter_read < 4)
{
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 4)
{
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 5)
{
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
 
if(counter_read == 6)
{
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 7)
{
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
if(counter_read == 8)
{
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 9)
{
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 10)
{
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 11)
{
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
counter = 0;
}
 
if(counter_read == 12 )
{
STATE = RESET_SR;
counter_read = 0;
counter_write = 0;
 
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_cbc/aes_bfm_key_generation_dma_cbc.h
0,0 → 1,521
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_key_generation_dma_cbc_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CBC_KEY_GEN_DMA && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
 
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
 
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 6185;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 10)
{
counter_write = 0;
counter_read = 0;
 
STATE =WAIT_SR;
 
 
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_KEY_GEN;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 10;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_KEY_GEN:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
 
if(counter_read == 0)
{
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 1)
{
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 2)
{
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
if(counter_read == 3)
{
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter = 0;
}
 
if(counter_read == 8)
{
STATE = RESET_SR;
counter_write = 0;
counter_read = 0;
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_cbc/aes_bfm_derivation_decryption_cbc.h
0,0 → 1,580
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_derivation_decryption_cbc_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CBC_DERIVATION_DECRYPTION && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
//ENABLE CR
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 25;//data_in(rd);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
//WRITE DINR
if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_CBC_FIPS_DERIVATED[0];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[1];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[2];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_CBC_FIPS_DERIVATED[4];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[5];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[6];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_CBC_FIPS_DERIVATED[8];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[9];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[10];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_CBC_FIPS_DERIVATED[12];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[13];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[14];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[15];
v_ecb.value.integer = d;
 
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
 
}
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 14)
{
counter_write = 0;
 
STATE =WAIT_SR;
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
if(counter_read < 4)
{
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 4)
{
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 5)
{
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
 
if(counter_read == 6)
{
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 7)
{
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
if(counter_read == 8)
{
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 9)
{
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 10)
{
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 11)
{
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
counter = 0;
}
 
if(counter_read == 12 )
{
STATE = RESET_SR;
counter_read = 0;
counter_write = 0;
 
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_cbc/aes_bfm_derivation_decryption_dma_cbc.h
0,0 → 1,579
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_derivation_decryption_dma_cbc_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CBC_DERIVATION_DECRYPTION_DMA && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CBC_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CBC_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CBC_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CBC_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CBC_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CBC_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CBC_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CBC_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
//ENABLE CR
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 6201;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
//WRITE DINR
if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_CBC_FIPS_DERIVATED[0];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[1];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[2];
a = a << 8;
a = a | TEXT_CBC_FIPS_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_CBC_FIPS_DERIVATED[4];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[5];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[6];
b = b << 8;
b = b | TEXT_CBC_FIPS_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_CBC_FIPS_DERIVATED[8];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[9];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[10];
c = c << 8;
c = c | TEXT_CBC_FIPS_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_CBC_FIPS_DERIVATED[12];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[13];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[14];
d = d << 8;
d = d | TEXT_CBC_FIPS_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
 
}
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 14)
{
counter_write = 0;
 
STATE =WAIT_SR;
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
if(counter_read < 4)
{
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 4)
{
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 5)
{
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
 
if(counter_read == 6)
{
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 7)
{
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
if(counter_read == 8)
{
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 9)
{
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 10)
{
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 11)
{
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
counter = 0;
}
 
if(counter_read == 12 )
{
STATE = RESET_SR;
counter_read = 0;
counter_write = 0;
 
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/aes_bfm_generate.h
72,10 → 72,10
////
////
///////////////////////////////////////////////////////////////////
 
static int aes_bfm_generate_calltf(char*user_data)
{
 
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle i = vpi_handle_by_name("AES_GLADIC_tb.i", NULL);
 
86,7 → 86,7
{
 
FIPS_ENABLE = FIPS;
// type_bfm = AES_WR_ONLY;
type_bfm = AES_WR_ONLY;
// type_bfm = AES_WR_ERROR_DINR_ONLY;
// type_bfm = AES_WR_ERROR_DOUTR_ONLY;
 
103,9 → 103,40
// type_bfm = ECB_ENCRYPTION_CCFIE;
// type_bfm = ECB_DECRYPTION_CCFIE;
// type_bfm = ECB_DERIVATION_DECRYPTION_CCFIE;
type_bfm = ECB_KEY_GEN_CCFIE;
// type_bfm = ECB_KEY_GEN_CCFIE;
 
// type_bfm = CBC_ENCRYPTION;
// type_bfm = CBC_DECRYPTION;
// type_bfm = CBC_DERIVATION_DECRYPTION;
// type_bfm = CBC_KEY_GEN;
 
// type_bfm = CBC_ENCRYPTION_DMA;
// type_bfm = CBC_DECRYPTION_DMA;
// type_bfm = CBC_DERIVATION_DECRYPTION_DMA;
// type_bfm = CBC_KEY_GEN_DMA;
 
// type_bfm = CBC_ENCRYPTION_CCFIE;
// type_bfm = CBC_DECRYPTION_CCFIE;
// type_bfm = CBC_DERIVATION_DECRYPTION_CCFIE;
// type_bfm = CBC_KEY_GEN_CCFIE;
 
// type_bfm = CTR_ENCRYPTION;
// type_bfm = CTR_DECRYPTION;
// type_bfm = CTR_KEY_GEN;
// type_bfm = CTR_DERIVATION_DECRYPTION;
 
 
// type_bfm = CTR_ENCRYPTION_DMA;
// type_bfm = CTR_DECRYPTION_DMA;
// type_bfm = CTR_KEY_GEN_DMA;
// type_bfm = CTR_DERIVATION_DECRYPTION_DMA;
 
 
// type_bfm = CTR_ENCRYPTION_CCFIE;
// type_bfm = CTR_DECRYPTION_CCFIE;
// type_bfm = CTR_KEY_GEN_CCFIE;
// type_bfm = CTR_DERIVATION_DECRYPTION_CCFIE;
 
if(PACKETS_GENERATED == MAX_ITERATIONS)
{
v_generate.value.integer = 1;
/trunk/pli/bfm_ctr/aes_bfm_derivation_decryption_dma_ctr.h
0,0 → 1,579
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_derivation_decryption_dma_ctr_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CTR_DERIVATION_DECRYPTION_DMA && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
//ENABLE CR
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 6233;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
//WRITE DINR
if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_CTR_FIPS_DERIVATED[0];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[1];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[2];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_CTR_FIPS_DERIVATED[4];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[5];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[6];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_CTR_FIPS_DERIVATED[8];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[9];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[10];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_CTR_FIPS_DERIVATED[12];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[13];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[14];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
 
}
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 14)
{
counter_write = 0;
 
STATE =WAIT_SR;
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 10;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
if(counter_read < 4)
{
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 4)
{
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 5)
{
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
 
if(counter_read == 6)
{
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 7)
{
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
if(counter_read == 8)
{
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 9)
{
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 10)
{
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 11)
{
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
counter = 0;
}
 
if(counter_read == 12 )
{
STATE = RESET_SR;
counter_read = 0;
counter_write = 0;
 
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_ctr/aes_bfm_decryption_ccfie_ctr.h
0,0 → 1,608
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_decryption_ccfie_ctr_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CTR_DECRYPTION_CCFIE && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
 
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 593;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
 
if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_CTR_FIPS_DERIVATED[0];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[1];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[2];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_CTR_FIPS_DERIVATED[4];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[5];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[6];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_CTR_FIPS_DERIVATED[8];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[9];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[10];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_CTR_FIPS_DERIVATED[12];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[13];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[14];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[15];
v_ecb.value.integer = d;
 
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
 
}
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 14)
{
counter_write = 0;
 
STATE =WAIT_SR;
 
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 10;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_read == 12)
{
STATE = RESET_SR;
counter_read = 0;
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_ctr/aes_bfm_encryption_ctr.h
0,0 → 1,605
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_encryption_ctr_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CTR_ENCRYPTION && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
 
 
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
 
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
 
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
}else if(counter_write == 9)//ENABLE CR
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 65;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}else if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
 
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
 
}
counter=0;
 
}
 
 
 
if(counter_write == 14)
{
counter_write = 0;
STATE = WAIT_SR;
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 10;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_read == 12)
{
STATE = RESET_SR;
counter_read = 0;
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
 
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_ctr/aes_bfm_encryption_dma_ctr.h
0,0 → 1,611
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_encryption_ctr_dma_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CTR_ENCRYPTION_DMA && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
 
 
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
 
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
 
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
//vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
}else if(counter_write == 9)//ENABLE CR
{
 
v_ecb.value.integer = ADDR_AES_CR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
//v_ecb.value.integer = 1;
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 6209;//data_in(rd);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}else if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
 
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
 
}
counter=0;
 
}
 
 
 
if(counter_write == 14)
{
counter_write = 0;
STATE = WAIT_SR;
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 10;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_read == 12)
{
STATE = RESET_SR;
counter_read = 0;
}
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
 
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_ctr/aes_bfm_key_generation_ccfie_ctr.h
0,0 → 1,513
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_key_generation_ccfie_ctr_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CTR_KEY_GEN_CCFIE && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
 
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
 
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 585;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 10)
{
counter_write = 0;
counter_read = 0;
 
STATE =WAIT_SR;
 
 
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_KEY_GEN;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_KEY_GEN:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
 
if(counter_read < 4)
{
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 4)
{
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 5)
{
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
 
if(counter_read == 6)
{
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 7)
{
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
if(counter_read == 8)
{
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 9)
{
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 10)
{
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 11)
{
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter = 0;
}
 
if(counter_read == 12)
{
STATE = RESET_SR;
counter_write = 0;
counter_read = 0;
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_ctr/aes_bfm_derivation_decryption_ccfie_ctr.h
0,0 → 1,579
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_derivation_decryption_ccfie_ctr_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CTR_DERIVATION_DECRYPTION_CCFIE && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
//ENABLE CR
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 601;//data_in(rd);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
//WRITE DINR
if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_CTR_FIPS_DERIVATED[0];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[1];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[2];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_CTR_FIPS_DERIVATED[4];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[5];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[6];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_CTR_FIPS_DERIVATED[8];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[9];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[10];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_CTR_FIPS_DERIVATED[12];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[13];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[14];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
 
}
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 14)
{
counter_write = 0;
 
STATE =WAIT_SR;
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 10;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
if(counter_read < 4)
{
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 4)
{
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 5)
{
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
 
if(counter_read == 6)
{
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 7)
{
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
if(counter_read == 8)
{
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 9)
{
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 10)
{
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 11)
{
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
counter = 0;
}
 
if(counter_read == 12 )
{
STATE = RESET_SR;
counter_read = 0;
counter_write = 0;
 
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_ctr/aes_bfm_decryption_ctr.h
0,0 → 1,606
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_decryption_ctr_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CTR_DECRYPTION && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
 
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 81;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
 
if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_CTR_FIPS_DERIVATED[0];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[1];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[2];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_CTR_FIPS_DERIVATED[4];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[5];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[6];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_CTR_FIPS_DERIVATED[8];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[9];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[10];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_CTR_FIPS_DERIVATED[12];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[13];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[14];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[15];
v_ecb.value.integer = d;
 
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
}
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 14)
{
counter_write = 0;
 
STATE =WAIT_SR;
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_read == 12)
{
STATE = RESET_SR;
counter_read = 0;
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_ctr/aes_bfm_decryption_dma_ctr.h
0,0 → 1,613
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_decryption_ctr_dma_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CTR_DECRYPTION_DMA && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
 
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 6225;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
 
if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_CTR_FIPS_DERIVATED[0];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[1];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[2];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_CTR_FIPS_DERIVATED[4];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[5];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[6];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_CTR_FIPS_DERIVATED[8];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[9];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[10];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_CTR_FIPS_DERIVATED[12];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[13];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[14];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[15];
v_ecb.value.integer = d;
 
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
 
}
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 14)
{
counter_write = 0;
 
STATE =WAIT_SR;
 
 
 
 
 
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 10;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_read == 12)
{
STATE = RESET_SR;
counter_read = 0;
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_ctr/aes_bfm_encryption_ccfie_ctr.h
0,0 → 1,601
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_encryption_ccfie_ctr_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
//printf("%i\n",STATE);
 
if(type_bfm == CTR_ENCRYPTION_CCFIE && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
 
 
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
 
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
 
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
}else if(counter_write == 9)//ENABLE CR
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 577;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}else if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | TEXT_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | TEXT_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | TEXT_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | TEXT_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
 
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
 
}
counter=0;
 
}
 
 
 
if(counter_write == 14)
{
counter_write = 0;
STATE = WAIT_SR;
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 10;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_read == 12)
{
STATE = RESET_SR;
counter_read = 0;
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
 
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_ctr/aes_bfm_key_generation_ctr.h
0,0 → 1,510
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_key_generation_ctr_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CTR_KEY_GEN && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
 
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 73;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 10)
{
counter_write = 0;
counter_read = 0;
 
STATE =WAIT_SR;
 
 
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_KEY_GEN;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_KEY_GEN:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
if(counter_read < 4)
{
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 4)
{
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 5)
{
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
 
if(counter_read == 6)
{
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 7)
{
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
if(counter_read == 8)
{
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 9)
{
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 10)
{
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 11)
{
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
counter = 0;
}
 
if(counter_read == 12 )
{
STATE = RESET_SR;
counter_read = 0;
counter_write = 0;
 
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_ctr/aes_bfm_derivation_decryption_ctr.h
0,0 → 1,580
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_derivation_decryption_ctr_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CTR_DERIVATION_DECRYPTION && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
//ENABLE CR
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 89;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
//WRITE DINR
if(counter_write > 9 && counter_write < 14) //WRITE DINR
{
 
v_ecb.value.integer = ADDR_AES_DINR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
 
if(FIPS_ENABLE == FIPS)
{
 
if(counter_write == 10)
{
a = a | TEXT_CTR_FIPS_DERIVATED[0];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[1];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[2];
a = a << 8;
a = a | TEXT_CTR_FIPS_DERIVATED[3];
v_ecb.value.integer = a;
 
}else if(counter_write == 11)
{
b = b | TEXT_CTR_FIPS_DERIVATED[4];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[5];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[6];
b = b << 8;
b = b | TEXT_CTR_FIPS_DERIVATED[7];
v_ecb.value.integer = b;
 
}else if(counter_write == 12 )
{
 
c = c | TEXT_CTR_FIPS_DERIVATED[8];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[9];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[10];
c = c << 8;
c = c | TEXT_CTR_FIPS_DERIVATED[11];
v_ecb.value.integer = c;
 
}else if(counter_write == 13 )
{
d = d | TEXT_CTR_FIPS_DERIVATED[12];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[13];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[14];
d = d << 8;
d = d | TEXT_CTR_FIPS_DERIVATED[15];
v_ecb.value.integer = d;
 
}
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
 
 
}
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 14)
{
counter_write = 0;
 
STATE =WAIT_SR;
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_DOUTR;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 10;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_DOUTR:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
if(counter_read < 4)
{
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 4)
{
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 5)
{
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
 
if(counter_read == 6)
{
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 7)
{
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
if(counter_read == 8)
{
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 9)
{
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 10)
{
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 11)
{
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
counter = 0;
}
 
if(counter_read == 12 )
{
STATE = RESET_SR;
counter_read = 0;
counter_write = 0;
 
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_ctr/aes_bfm_key_generation_dma_ctr.h
0,0 → 1,510
//////////////////////////////////////////////////////////////////
////
////
//// AES CORE BLOCK
////
////
////
//// This file is part of the APB to AES128 project
////
//// http://www.opencores.org/cores/apbtoaes128/
////
////
////
//// Description
////
//// Implementation of APB IP core according to
////
//// aes128_spec IP core specification document.
////
////
////
//// To Do: Things are right here but always all block can suffer changes
////
////
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
////
//// Copyright (C) 2009 Authors and OPENCORES.ORG
////
////
////
//// This source file may be used and distributed without
////
//// restriction provided that this copyright statement is not
////
//// removed from the file and that any derivative work contains
//// the original copyright notice and the associated disclaimer.
////
////
//// This source file is free software; you can redistribute it
////
//// and/or modify it under the terms of the GNU Lesser General
////
//// Public License as published by the Free Software Foundation;
//// either version 2.1 of the License, or (at your option) any
////
//// later version.
////
////
////
//// This source is distributed in the hope that it will be
////
//// useful, but WITHOUT ANY WARRANTY; without even the implied
////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
////
//// PURPOSE. See the GNU Lesser General Public License for more
//// details.
////
////
////
//// You should have received a copy of the GNU Lesser General
////
//// Public License along with this source; if not, download it
////
//// from http://www.opencores.org/lgpl.shtml
////
////
///////////////////////////////////////////////////////////////////
static int aes_bfm_key_generation_dma_ctr_calltf(char*user_data)
{
 
vpiHandle PRESETn = vpi_handle_by_name("AES_GLADIC_tb.PRESETn", NULL);
vpiHandle PWDATA = vpi_handle_by_name("AES_GLADIC_tb.PWDATA", NULL);
vpiHandle PENABLE = vpi_handle_by_name("AES_GLADIC_tb.PENABLE", NULL);
vpiHandle PSEL = vpi_handle_by_name("AES_GLADIC_tb.PSEL", NULL);
vpiHandle PWRITE = vpi_handle_by_name("AES_GLADIC_tb.PWRITE", NULL);
vpiHandle PADDR = vpi_handle_by_name("AES_GLADIC_tb.PADDR", NULL);
vpiHandle PRDATA = vpi_handle_by_name("AES_GLADIC_tb.PRDATA", NULL);
vpiHandle PREADY = vpi_handle_by_name("AES_GLADIC_tb.PREADY", NULL);
vpiHandle PSLVERR = vpi_handle_by_name("AES_GLADIC_tb.PSLVERR", NULL);
vpiHandle int_ccf = vpi_handle_by_name("AES_GLADIC_tb.int_ccf", NULL);
vpiHandle int_err = vpi_handle_by_name("AES_GLADIC_tb.int_err", NULL);
vpiHandle dma_req_wr = vpi_handle_by_name("AES_GLADIC_tb.dma_req_wr", NULL);
vpiHandle dma_req_rd = vpi_handle_by_name("AES_GLADIC_tb.dma_req_rd", NULL);
 
std::random_device rd;
std::uniform_int_distribution<long int> data_in(0,4294967295);
v_ecb.format=vpiIntVal;
 
vpi_get_value(PRESETn, &v_ecb);
 
 
//printf("%i\n",STATE);
 
 
if(type_bfm == CTR_KEY_GEN_DMA && v_ecb.value.integer == 1)
{
 
switch(STATE)
{
case IDLE:
 
if(PACKETS_GENERATED >= MAX_ITERATIONS)
{
 
STATE = IDLE;
type_bfm = 0;
 
}else
{
STATE = WRITE;
counter = 0;
 
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
v_ecb.value.integer = vector_address[0];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
}
 
break;
case WRITE:
if(counter == 0)
{
 
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_write < 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
 
if(FIPS_ENABLE == FIPS)
{
 
if(vector_address[counter_write] == ADDR_AES_KEYR3)
{
a = a | KEY_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | KEY_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_KEYR2)
{
b = b | KEY_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | KEY_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR1)
{
 
c = c | KEY_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | KEY_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_KEYR0)
{
d = d | KEY_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | KEY_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR3)
{
a = a | IV_FIPS_CTR_NOT_DERIVATED[0];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[1];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[2];
a = a << 8;
a = a | IV_FIPS_CTR_NOT_DERIVATED[3];
v_ecb.value.integer = a;
}
 
 
if(vector_address[counter_write] == ADDR_AES_IVR2)
{
b = b | IV_FIPS_CTR_NOT_DERIVATED[4];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[5];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[6];
b = b << 8;
b = b | IV_FIPS_CTR_NOT_DERIVATED[7];
v_ecb.value.integer = b;
}
 
if(vector_address[counter_write] == ADDR_AES_IVR1)
{
 
c = c | IV_FIPS_CTR_NOT_DERIVATED[8];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[9];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[10];
c = c << 8;
c = c | IV_FIPS_CTR_NOT_DERIVATED[11];
v_ecb.value.integer = c;
 
}
 
if(vector_address[counter_write] == ADDR_AES_IVR0)
{
d = d | IV_FIPS_CTR_NOT_DERIVATED[12];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[13];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[14];
d = d << 8;
d = d | IV_FIPS_CTR_NOT_DERIVATED[15];
v_ecb.value.integer = d;
}
 
 
 
}else if(FIPS_ENABLE == RANDOM_DATA)
{
v_ecb.value.integer = data_in(rd);
}
 
//vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
a = 0;
b = 0;
c = 0;
d = 0;
}
 
if(counter_write == 9)
{
 
v_ecb.value.integer = vector_address[counter_write];
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = 6217;
vpi_put_value(PWDATA, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
if(counter_write == 10)
{
counter_write = 0;
counter_read = 0;
 
STATE =WAIT_SR;
 
 
}
 
break;
 
case WAIT_SR:
 
v_ecb.value.integer = ADDR_AES_SR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
if(counter == 0)
{
 
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter=0;
}
 
v_ecb.value.integer = 0;
vpi_get_value(PRDATA,&v_ecb);
 
if(v_ecb.value.integer == 1)
{
STATE = READ_KEY_GEN;
 
t_ecb.type = vpiScaledRealTime;
t_ecb.real = 0;
v_ecb.format=vpiIntVal;
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, &t_ecb, vpiTransportDelay);
}
 
break;
 
 
case READ_KEY_GEN:
 
 
if(counter == 0)
{
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_read++;
counter++;
 
 
 
}else if(counter == 1)
{
 
if(counter_read < 4)
{
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 4)
{
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 5)
{
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
 
if(counter_read == 6)
{
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 7)
{
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
if(counter_read == 8)
{
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 9)
{
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 10)
{
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
if(counter_read == 11)
{
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
}
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter = 0;
}
 
if(counter_read == 12)
{
STATE = RESET_SR;
counter_write = 0;
counter_read = 0;
}
 
break;
 
case RESET_SR:
 
v_ecb.value.integer = 1;
vpi_put_value(PWRITE, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PSEL, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 128;
vpi_put_value(PWDATA, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter == 0)
{
 
counter_write++;
counter++;
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
}else if(counter == 1)
{
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
counter=0;
 
}
 
if(counter_write == 1)
{
STATE =IDLE;
counter_write = 0;
counter=0;
PACKETS_GENERATED = PACKETS_GENERATED + 1;
}
 
 
break;
 
}
}
 
return 0;
}
/trunk/pli/bfm_ecb/aes_bfm_key_generation_dma_ecb.h
364,6 → 364,43
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
370,7 → 407,7
counter = 0;
}
 
if(counter_read == 4)
if(counter_read == 8)
{
STATE = RESET_SR;
counter_write = 0;
/trunk/pli/bfm_ecb/aes_bfm_decryption_ccfie_ecb.h
25,7 → 25,7
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
399,13 → 399,10
if(counter == 0)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_write++;
counter_read++;
counter++;
 
 
415,15 → 412,97
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_write == 4)
if(counter_read == 12)
{
STATE = RESET_SR;
counter_write = 0;
 
counter_read = 0;
}
 
break;
/trunk/pli/bfm_ecb/aes_bfm_encryption_ecb.h
390,13 → 390,10
if(counter == 0)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_write++;
counter_read++;
counter++;
 
 
406,14 → 403,97
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_write == 4)
if(counter_read == 12)
{
STATE = RESET_SR;
counter_write = 0;
counter_read = 0;
}
 
break;
/trunk/pli/bfm_ecb/aes_bfm_encryption_dma_ecb.h
399,13 → 399,10
if(counter == 0)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_write++;
counter_read++;
counter++;
 
 
415,14 → 412,97
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_write == 4)
if(counter_read == 12)
{
STATE = RESET_SR;
counter_write = 0;
counter_read = 0;
}
 
break;
/trunk/pli/bfm_ecb/aes_bfm_key_generation_ccfie_ecb.h
364,6 → 364,43
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
370,7 → 407,7
counter = 0;
}
 
if(counter_read == 4)
if(counter_read == 8)
{
STATE = RESET_SR;
counter_write = 0;
/trunk/pli/bfm_ecb/aes_bfm_derivation_decryption_ccfie_ecb.h
25,7 → 25,7
////
////
////
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
//// Author(s): - Felipe Fernandes Da Costa, fefe2560@gmail.com
////
/////////////////////////////////////////////////////////////////
////
/trunk/pli/bfm_ecb/aes_bfm_decryption_ecb.h
399,13 → 399,10
if(counter == 0)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_write++;
counter_read++;
counter++;
 
 
415,15 → 412,97
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_write == 4)
if(counter_read == 12)
{
STATE = RESET_SR;
counter_write = 0;
 
counter_read = 0;
}
 
break;
/trunk/pli/bfm_ecb/aes_bfm_decryption_dma_ecb.h
399,13 → 399,10
if(counter == 0)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_write++;
counter_read++;
counter++;
 
 
415,15 → 412,97
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_write == 4)
if(counter_read == 12)
{
STATE = RESET_SR;
counter_write = 0;
 
counter_read = 0;
}
 
break;
/trunk/pli/bfm_ecb/aes_bfm_encryption_ccfie_ecb.h
390,13 → 390,10
if(counter == 0)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
counter_write++;
counter_read++;
counter++;
 
 
406,14 → 403,97
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
if(counter_read < 4)
{
 
v_ecb.value.integer = ADDR_AES_DOUTR;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_KEYR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_KEYR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_KEYR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_KEYR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 8)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 9)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 10)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 11)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
counter = 0;
}
 
if(counter_write == 4)
if(counter_read == 12)
{
STATE = RESET_SR;
counter_write = 0;
counter_read = 0;
}
 
break;
/trunk/pli/bfm_ecb/aes_bfm_key_generation_ecb.h
363,6 → 363,43
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
if(counter_read == 4)
{
 
v_ecb.value.integer = ADDR_AES_IVR3;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 5)
{
 
v_ecb.value.integer = ADDR_AES_IVR2;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
 
if(counter_read == 6)
{
 
v_ecb.value.integer = ADDR_AES_IVR1;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
 
if(counter_read == 7)
{
 
v_ecb.value.integer = ADDR_AES_IVR0;
vpi_put_value(PADDR, &v_ecb, NULL, vpiNoDelay);
 
}
 
v_ecb.value.integer = 0;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
369,7 → 406,7
counter = 0;
}
 
if(counter_read == 4)
if(counter_read == 8)
{
STATE = RESET_SR;
counter_write = 0;
402,6 → 439,7
v_ecb.value.integer = 1;
vpi_put_value(PENABLE, &v_ecb, NULL, vpiNoDelay);
 
 
}else if(counter == 1)
{
 

powered by: WebSVN 2.1.0

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