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

Subversion Repositories ahb_master

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 9 to Rev 10
    Reverse comparison

Rev 9 → Rev 10

/ahb_master/trunk/robust_ahb_master.pro
0,0 → 1,14
PROJDIR = run
 
SRCFILE = ahb_master.v
DEFFILE =
 
OUTDIR = out
 
INCDIR += ../src/base
INCDIR += ../src/gen
 
LIST = list.txt
+LISTPATH
 
+HEADER
/ahb_master/trunk/run/run.bat
1,6 → 1,6
 
echo off
 
::..\..\..\robust.exe ../src/base/ahb_master.v -od out -I ../src/gen -list list.txt -listpath -header -gui
::..\..\..\..\robust.exe ../src/base/ahb_master.v -od out -I ../src/gen -list list.txt -listpath -header -gui
 
..\..\..\robust.exe robust_ahb_master.pro -gui %1 %2 %3
..\..\..\..\robust.exe ../robust_ahb_master.pro -gui %1 %2 %3
/ahb_master/trunk/run/run.sh
1,12 → 1,12
#!/bin/bash
 
../../../robust -null
../../../../robust -null
if [ $? -eq 0 ];then
ROBUST=../../../robust
ROBUST=../../../../robust
else
echo "RobustVerilog warning: GUI version not supported - using non-GUI version robust-lite"
ROBUST=../../../robust-lite
ROBUST=../../../../robust-lite
fi
 
#$ROBUST ../src/base/ahb_master.v -od out -I ../src/gen -list list.txt -listpath -header -gui ${@}
$ROBUST robust_ahb_master.pro -gui ${@}
#$ROBUST src/base/ahb_master.v -od out -I ../src/gen -list list.txt -listpath -header -gui ${@}
$ROBUST ../robust_ahb_master.pro -gui ${@}
/ahb_master/trunk/src/gen/prgen_rand.v
66,7 → 66,6
input [31:0] num;
input [31:0] align_size;
integer align;
begin
align = num - (num % align_size);
end
76,14 → 75,13
function integer rand_align;
input [31:0] min;
input [31:0] max;
input [31:0] align;
input [31:0] align_val;
 
integer rand_align;
begin
rand_align = rand(min, max);
if (rand_align > align)
rand_align = align(rand_align, align);
if (rand_align > align_val)
rand_align = align(rand_align, align_val);
end
endfunction
 
/ahb_master/trunk/src/base/ic_wdata.v
27,6 → 27,7
//// ////
//////////////////////////////////////////////////////////////////##>
 
OUTFILE PREFIX_ic_wdata.v
 
ITER MX
/ahb_master/trunk/src/base/ic_registry_resp.v
31,11 → 31,6
 
ITER MX
ITER SX
 
LOOP MX
ITER MMX_IDX
ENDLOOP MX
 
module PREFIX_ic_registry_resp(PORTS);
51,66 → 46,56
output [MSTR_BITS-1:0] SSX_MSTR;
output SSX_OK;
 
 
wire Amatch_MMX_IDGROUP_MMX_ID.IDX;
wire Amatch_MMX_IDMMX_IDX;
wire match_SSX_MMX_IDMMX_IDX;
wire match_SSX_MMX_IDGROUP_MMX_ID.IDX;
wire no_Amatch_MMX;
wire cmd_push_MMX;
wire cmd_push_MMX_IDMMX_IDX;
wire cmd_push_MMX_IDGROUP_MMX_ID.IDX;
wire cmd_pop_SSX;
LOOP MX
wire cmd_pop_MMX_IDMMX_IDX;
ENDLOOP MX
wire cmd_pop_MMX_IDGROUP_MMX_ID.IDX;
 
wire [SLV_BITS-1:0] slave_in_MMX_IDMMX_IDX;
wire [SLV_BITS-1:0] slave_out_MMX_IDMMX_IDX;
wire slave_empty_MMX_IDMMX_IDX;
wire slave_full_MMX_IDMMX_IDX;
wire [SLV_BITS-1:0] slave_in_MMX_IDGROUP_MMX_ID.IDX;
wire [SLV_BITS-1:0] slave_out_MMX_IDGROUP_MMX_ID.IDX;
wire slave_empty_MMX_IDGROUP_MMX_ID.IDX;
wire slave_full_MMX_IDGROUP_MMX_ID.IDX;
 
reg [MSTR_BITS-1:0] ERR_MSTR_reg;
wire [MSTR_BITS-1:0] ERR_MSTR;
reg [MSTR_BITS-1:0] ERR_MSTR_reg;
wire [MSTR_BITS-1:0] ERR_MSTR;
reg [MSTR_BITS-1:0] SSX_MSTR;
reg SSX_OK;
reg [MSTR_BITS-1:0] SSX_MSTR;
reg SSX_OK;
 
assign Amatch_MMX_IDMMX_IDX = MMX_AID == ID_MMX_IDMMX_IDX;
assign Amatch_MMX_IDGROUP_MMX_ID.IDX = MMX_AID == ID_BITS'GROUP_MMX_ID;
assign match_SSX_MMX_IDMMX_IDX = SSX_ID == ID_MMX_IDMMX_IDX;
assign match_SSX_MMX_IDGROUP_MMX_ID.IDX = SSX_ID == ID_BITS'GROUP_MMX_ID;
 
assign cmd_push_MMX = MMX_AVALID & MMX_AREADY;
assign cmd_push_MMX_IDMMX_IDX = cmd_push_MMX & Amatch_MMX_IDMMX_IDX;
assign cmd_push_MMX_IDGROUP_MMX_ID.IDX = cmd_push_MMX & Amatch_MMX_IDGROUP_MMX_ID.IDX;
assign cmd_pop_SSX = SSX_VALID & SSX_READY & SSX_LAST;
LOOP MX
assign cmd_pop_MMX_IDMMX_IDX = CONCAT((cmd_pop_SSX & match_SSX_MMX_IDMMX_IDX) |);
ENDLOOP MX
assign slave_in_MMX_IDMMX_IDX = MMX_ASLV;
LOOP MX
assign cmd_pop_MMX_IDGROUP_MMX_ID.IDX = CONCAT((cmd_pop_SSX & match_SSX_MMX_IDGROUP_MMX_ID.IDX) |);
ENDLOOP MX
assign slave_in_MMX_IDGROUP_MMX_ID.IDX = MMX_ASLV;
 
 
 
 
IFDEF DEF_DECERR_SLV
LOOP MX
assign no_Amatch_MMX = CONCAT((~Amatch_MMX_IDMMX_IDX) &);
ENDLOOP MX
assign no_Amatch_MMX = GONCAT.REV((~Amatch_MMX_IDGROUP_MMX_ID.IDX) &);
 
always @(posedge clk or posedge reset)
if (reset)
ERR_MSTR_reg <= #FFD {MSTR_BITS{1'b0}};
LOOP MX
else if (cmd_push_MMX & no_Amatch_MMX)
ERR_MSTR_reg <= #FFD 'dMX;
ENDLOOP MX
else if (cmd_push_MMX & no_Amatch_MMX) ERR_MSTR_reg <= #FFD MSTR_BITS'dMX;
assign ERR_MSTR = ERR_MSTR_reg;
ELSE DEF_DECERR_SLV
119,12 → 104,10
LOOP SX
always @(SSX_ID or ERR_MSTR)
always @(*)
begin
case (SSX_ID)
LOOP MX
ID_MMX_IDMMX_IDX : SSX_MSTR = 'dMX;
ENDLOOP MX
ID_BITS'GROUP_MMX_ID : SSX_MSTR = MSTR_BITS'dMX;
default : SSX_MSTR = ERR_MSTR;
endcase
end
132,9 → 115,7
always @(*)
begin
case (SSX_ID)
LOOP MX
ID_MMX_IDMMX_IDX : SSX_OK = slave_out_MMX_IDMMX_IDX == 'dSX;
ENDLOOP MX
ID_BITS'GROUP_MMX_ID : SSX_OK = slave_out_MMX_IDGROUP_MMX_ID.IDX == SLV_BITS'dSX;
default : SSX_OK = 1'b1; //SLVERR
endcase
end
142,20 → 123,20
 
CREATE prgen_fifo.v DEFCMD(SWAP CONST(#FFD) #FFD)
LOOP MX
LOOP MMX_IDX
LOOP IX GROUP_MMX_ID.NUM
prgen_fifo #(SLV_BITS, CMD_DEPTH)
slave_fifo_MMX_IDMMX_IDX(
.clk(clk),
.reset(reset),
.push(cmd_push_MMX_IDMMX_IDX),
.pop(cmd_pop_MMX_IDMMX_IDX),
.din(slave_in_MMX_IDMMX_IDX),
.dout(slave_out_MMX_IDMMX_IDX),
.empty(slave_empty_MMX_IDMMX_IDX),
.full(slave_full_MMX_IDMMX_IDX)
);
slave_fifo_MMX_IDIX(
.clk(clk),
.reset(reset),
.push(cmd_push_MMX_IDIX),
.pop(cmd_pop_MMX_IDIX),
.din(slave_in_MMX_IDIX),
.dout(slave_out_MMX_IDIX),
.empty(slave_empty_MMX_IDIX),
.full(slave_full_MMX_IDIX)
);
ENDLOOP MMX_IDX
ENDLOOP IX
ENDLOOP MX
 
/ahb_master/trunk/src/base/axi2ahb.v
26,124 → 26,124
//// details. http://www.gnu.org/licenses/lgpl.html ////
//// ////
/////////////////////////////////////////////////////////////////////
 
INCLUDE def_axi2ahb.txt
OUTFILE PREFIX_axi2ahb.v
 
CHECK CONST(#FFD)
CHECK CONST(PREFIX)
CHECK CONST(ADDR_BITS)
CHECK CONST(DATA_BITS)
CHECK CONST(ID_BITS)
CHECK CONST(CMD_DEPTH)
 
module PREFIX_axi2ahb (PORTS);
 
input clk;
input reset;
 
port GROUP_AXI;
 
revport GROUP_AHB;
 
//outputs of cmd
wire cmd_empty;
wire cmd_read;
wire [ID_BITS-1:0] cmd_id;
wire [ADDR_BITS-1:0] cmd_addr;
wire [3:0] cmd_len;
wire [1:0] cmd_size;
wire cmd_err;
//outputs of ctrl
wire ahb_finish;
wire data_last;
 
//outputs of wr fifo
wire wdata_phase;
wire wdata_ready;
//outputs of rd fifo
wire rdata_phase;
wire rdata_ready;
 
CREATE axi2ahb_cmd.v
PREFIX_axi2ahb_cmd PREFIX_axi2ahb_cmd(
.clk(clk),
.reset(reset),
.AWGROUP_AXI_A(AWGROUP_AXI_A),
.ARGROUP_AXI_A(ARGROUP_AXI_A),
.GROUP_AHB(GROUP_AHB),
.ahb_finish(ahb_finish),
.cmd_empty(cmd_empty),
.cmd_read(cmd_read),
.cmd_id(cmd_id),
.cmd_addr(cmd_addr),
.cmd_len(cmd_len),
.cmd_size(cmd_size),
.cmd_err(cmd_err)
);
 
 
CREATE axi2ahb_ctrl.v
PREFIX_axi2ahb_ctrl PREFIX_axi2ahb_ctrl(
.clk(clk),
.reset(reset),
.GROUP_AHB(GROUP_AHB),
.ahb_finish(ahb_finish),
.rdata_phase(rdata_phase),
.wdata_phase(wdata_phase),
.data_last(data_last),
.rdata_ready(rdata_ready),
.wdata_ready(wdata_ready),
.cmd_empty(cmd_empty),
.cmd_read(cmd_read),
.cmd_addr(cmd_addr),
.cmd_len(cmd_len),
.cmd_size(cmd_size)
);
 
CREATE axi2ahb_wr_fifo.v
PREFIX_axi2ahb_wr_fifo
PREFIX_axi2ahb_wr_fifo(
.clk(clk),
.reset(reset),
.WGROUP_AXI_W(WGROUP_AXI_W),
.BGROUP_AXI_B(BGROUP_AXI_B),
.HWDATA(HWDATA),
.HREADY(HREADY),
.HTRANS(HTRANS),
.HRESP(HRESP),
.cmd_err(cmd_err),
.wdata_phase(wdata_phase),
.wdata_ready(wdata_ready),
.data_last(data_last)
);
 
CREATE axi2ahb_rd_fifo.v
PREFIX_axi2ahb_rd_fifo
PREFIX_axi2ahb_rd_fifo(
.clk(clk),
.reset(reset),
.RGROUP_AXI_R(RGROUP_AXI_R),
.HRDATA(HRDATA),
.HREADY(HREADY),
.HTRANS(HTRANS),
.HRESP(HRESP),
.cmd_id(cmd_id),
.cmd_err(cmd_err),
.rdata_phase(rdata_phase),
.rdata_ready(rdata_ready),
.data_last(data_last)
);
 
endmodule
 
 
 
INCLUDE def_axi2ahb.txt
OUTFILE PREFIX.v
 
CHECK CONST(#FFD)
CHECK CONST(PREFIX)
CHECK CONST(ADDR_BITS)
CHECK CONST(DATA_BITS)
CHECK CONST(ID_BITS)
CHECK CONST(CMD_DEPTH)
module PREFIX (PORTS);
 
input clk;
input reset;
 
port GROUP_AXI;
 
revport GROUP_AHB;
 
//outputs of cmd
wire cmd_empty;
wire cmd_read;
wire [ID_BITS-1:0] cmd_id;
wire [ADDR_BITS-1:0] cmd_addr;
wire [3:0] cmd_len;
wire [1:0] cmd_size;
wire cmd_err;
//outputs of ctrl
wire ahb_finish;
wire data_last;
 
//outputs of wr fifo
wire wdata_phase;
wire wdata_ready;
//outputs of rd fifo
wire rdata_phase;
wire rdata_ready;
 
CREATE axi2ahb_cmd.v
PREFIX_cmd PREFIX_cmd(
.clk(clk),
.reset(reset),
.AWGROUP_AXI_A(AWGROUP_AXI_A),
.ARGROUP_AXI_A(ARGROUP_AXI_A),
.GROUP_AHB(GROUP_AHB),
.ahb_finish(ahb_finish),
.cmd_empty(cmd_empty),
.cmd_read(cmd_read),
.cmd_id(cmd_id),
.cmd_addr(cmd_addr),
.cmd_len(cmd_len),
.cmd_size(cmd_size),
.cmd_err(cmd_err)
);
 
 
CREATE axi2ahb_ctrl.v
PREFIX_ctrl PREFIX_ctrl(
.clk(clk),
.reset(reset),
.GROUP_AHB(GROUP_AHB),
.ahb_finish(ahb_finish),
.rdata_phase(rdata_phase),
.wdata_phase(wdata_phase),
.data_last(data_last),
.rdata_ready(rdata_ready),
.wdata_ready(wdata_ready),
.cmd_empty(cmd_empty),
.cmd_read(cmd_read),
.cmd_addr(cmd_addr),
.cmd_len(cmd_len),
.cmd_size(cmd_size)
);
 
CREATE axi2ahb_wr_fifo.v
PREFIX_wr_fifo
PREFIX_wr_fifo(
.clk(clk),
.reset(reset),
.WGROUP_AXI_W(WGROUP_AXI_W),
.BGROUP_AXI_B(BGROUP_AXI_B),
.HWDATA(HWDATA),
.HREADY(HREADY),
.HTRANS(HTRANS),
.HRESP(HRESP),
.cmd_err(cmd_err),
.wdata_phase(wdata_phase),
.wdata_ready(wdata_ready),
.data_last(data_last)
);
 
CREATE axi2ahb_rd_fifo.v
PREFIX_rd_fifo
PREFIX_rd_fifo(
.clk(clk),
.reset(reset),
.RGROUP_AXI_R(RGROUP_AXI_R),
.HRDATA(HRDATA),
.HREADY(HREADY),
.HTRANS(HTRANS),
.HRESP(HRESP),
.cmd_id(cmd_id),
.cmd_err(cmd_err),
.rdata_phase(rdata_phase),
.rdata_ready(rdata_ready),
.data_last(data_last)
);
 
endmodule
 
 
/ahb_master/trunk/src/base/ic_decerr.v
53,7 → 53,6
reg RVALID;
reg [4-1:0] rvalid_cnt;
 
IFDEF TRUE (USER_BITS>0)
assign BUSER = 'd0;
assign RUSER = 'd0;
/ahb_master/trunk/src/base/def_ic.txt
1,36 → 1,62
<##//////////////////////////////////////////////////////////////////
//// ////
//// Author: Eyal Hochberg ////
//// eyal@provartec.com ////
//// ////
//// Downloaded from: http://www.opencores.org ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2010 Provartec LTD ////
//// www.provartec.com ////
//// info@provartec.com ////
//// ////
//// 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.////
//// ////
//// 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. http://www.gnu.org/licenses/lgpl.html ////
//// ////
//////////////////////////////////////////////////////////////////##>
<##//////////////////////////////////////////////////////////////////
//// ////
//// Author: Eyal Hochberg ////
//// eyal@provartec.com ////
//// ////
//// Downloaded from: http://www.opencores.org ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2010 Provartec LTD ////
//// www.provartec.com ////
//// info@provartec.com ////
//// ////
//// 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.////
//// ////
//// 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. http://www.gnu.org/licenses/lgpl.html ////
//// ////
//////////////////////////////////////////////////////////////////##>
 
REQUIRE(1.4)
 
INCLUDE def_ic_static.txt
 
SWAP PREFIX PARENT ##prefix for all module and file names
SWAP.GLOBAL #FFD #1 ##flip-flop delay
 
SWAP SLAVE_NUM 1 ##number of slaves
SWAP.USER PREFIX fabric_MASTER_NUM_SLAVE_NUM ##prefix for all module and file names
 
SWAP USER_BITS 0 ##AXI user bits
SWAP.USER MASTER_NUM 3 ##number of masters
SWAP.USER SLAVE_NUM 6 ##number of slaves
 
SWAP.USER CMD_DEPTH 8 ##AXI command depth for read and write
 
SWAP.USER DATA_BITS 64 ##AXI data bits
SWAP.USER ADDR_BITS 32 ##AXI address bits
 
DEFINE.USER DEF_DECERR_SLV ##use interanl decode slave error
SWAP.USER USER_BITS 4 ##AXI user bits
 
SWAP.USER ID_BITS 3 ##AXI ID bits
 
GROUP.USER M0_ID is { ##Supported AXI IDs for master 0
b000
b001
}
GROUP.USER M1_ID is { ##Supported AXI IDs for master
b011
}
GROUP.USER M2_ID is { ##Supported AXI IDs for master 2
b101
}
/ahb_master/trunk/src/base/def_axi_master.txt
26,23 → 26,27
//// details. http://www.gnu.org/licenses/lgpl.html ////
//// ////
//////////////////////////////////////////////////////////////////##>
 
INCLUDE def_axi_master_static.txt
 
SWAP.GLOBAL #FFD #1 ##Flip-Flop simulation delay
 
SWAP PREFIX axi_master ##prefix for all module and file names
SWAP ID_BITS 4 ##AXI ID bits
SWAP ADDR_BITS 32 ##AXI address bits
SWAP DATA_BITS 64 ##AXI data bits
SWAP LEN_BITS 4 ##AXI LEN bits
SWAP SIZE_BITS 2 ##AXI SIZE bits
 
SWAP CMD_DEPTH 4 ##AXI command depth for read and write
 
SWAP ID_NUM 3 ##Number of IDs (internal masters)
SWAP ID0_VAL ID_BITS'b0011 ##AXI ID0
SWAP ID1_VAL ID_BITS'b0010 ##AXI ID1
SWAP ID2_VAL ID_BITS'b1010 ##AXI ID2
 
 
REQUIRE(1.4)
 
INCLUDE def_axi_master_static.txt
 
SWAP.GLOBAL #FFD #1 ##Flip-Flop simulation delay
 
SWAP.USER PREFIX axi_master ##prefix for all module and file names
SWAP.USER ADDR_BITS 32 ##AXI address bits
SWAP.USER DATA_BITS 64 ##AXI data bits
SWAP.USER LEN_BITS 4 ##AXI LEN bits
SWAP.USER SIZE_BITS 2 ##AXI SIZE bits
 
SWAP.USER CMD_DEPTH 4 ##AXI command depth for read and write
 
SWAP.USER ID_BITS 4 ##AXI ID bits
GROUP.USER AXI_ID is { ##Supported AXI IDs (one per internal master)
b0011
b0010
b1010
}
 
/ahb_master/trunk/src/base/axi2ahb_wr_fifo.v
28,9 → 28,9
/////////////////////////////////////////////////////////////////////
 
INCLUDE def_axi2ahb.txt
OUTFILE PREFIX_axi2ahb_wr_fifo.v
OUTFILE PREFIX_wr_fifo.v
 
module PREFIX_axi2ahb_wr_fifo (PORTS);
module PREFIX_wr_fifo (PORTS);
 
parameter FIFO_LINES = EXPR(2 * 16); //double buffer of max burst
parameter RESP_SLVERR = 2'b10;
/ahb_master/trunk/src/base/def_ic_static.txt
26,8 → 26,9
//// details. http://www.gnu.org/licenses/lgpl.html ////
//// ////
//////////////////////////////////////////////////////////////////##>
SWAP.GLOBAL MODEL_NAME AXI interconnect fabric
 
##Static defines
SWAP MSTRS MASTER_NUM
SWAP SLVS EXPR(SLAVE_NUM+DVAL(DEF_DECERR_SLV))
 
/ahb_master/trunk/src/base/ic_registry_wr.v
32,10 → 32,6
ITER MX
ITER SX
 
LOOP MX
ITER MMX_IDX
ENDLOOP MX
module PREFIX_ic_registry_wr(PORTS);
 
45,82 → 41,78
 
port MMX_AWGROUP_IC_AXI_CMD;
input [ID_BITS-1:0] MMX_WID;
input [ID_BITS-1:0] MMX_WID;
input MMX_WVALID;
input MMX_WREADY;
input MMX_WLAST;
output [SLV_BITS-1:0] MMX_WSLV;
output [SLV_BITS-1:0] MMX_WSLV;
output MMX_WOK;
input SSX_AWVALID;
input SSX_AWREADY;
input [MSTR_BITS-1:0] SSX_AWMSTR;
input [MSTR_BITS-1:0] SSX_AWMSTR;
input SSX_WVALID;
input SSX_WREADY;
input SSX_WLAST;
wire AWmatch_MMX_IDMMX_IDX;
wire Wmatch_MMX_IDMMX_IDX;
wire AWmatch_MMX_IDGROUP_MMX_ID.IDX;
wire Wmatch_MMX_IDGROUP_MMX_ID.IDX;
 
wire cmd_push_MMX;
wire cmd_push_MMX_IDMMX_IDX;
wire cmd_push_MMX_IDGROUP_MMX_ID.IDX;
wire cmd_pop_MMX;
wire cmd_pop_MMX_IDMMX_IDX;
wire cmd_pop_MMX_IDGROUP_MMX_ID.IDX;
 
wire [SLV_BITS-1:0] slave_in_MMX_IDMMX_IDX;
wire [SLV_BITS-1:0] slave_out_MMX_IDMMX_IDX;
wire slave_empty_MMX_IDMMX_IDX;
wire slave_full_MMX_IDMMX_IDX;
wire [SLV_BITS-1:0] slave_in_MMX_IDGROUP_MMX_ID.IDX;
wire [SLV_BITS-1:0] slave_out_MMX_IDGROUP_MMX_ID.IDX;
wire slave_empty_MMX_IDGROUP_MMX_ID.IDX;
wire slave_full_MMX_IDGROUP_MMX_ID.IDX;
 
wire cmd_push_SSX;
wire cmd_pop_SSX;
wire [MSTR_BITS-1:0] master_in_SSX;
wire [MSTR_BITS-1:0] master_out_SSX;
wire [MSTR_BITS-1:0] master_in_SSX;
wire [MSTR_BITS-1:0] master_out_SSX;
wire master_empty_SSX;
wire master_full_SSX;
reg [SLV_BITS-1:0] MMX_WSLV;
reg [SLV_BITS-1:0] MMX_WSLV;
reg MMX_WOK;
 
assign AWmatch_MMX_IDMMX_IDX = MMX_AWID == ID_MMX_IDMMX_IDX;
assign AWmatch_MMX_IDGROUP_MMX_ID.IDX = MMX_AWID == ID_BITS'GROUP_MMX_ID;
assign Wmatch_MMX_IDMMX_IDX = MMX_WID == ID_MMX_IDMMX_IDX;
assign Wmatch_MMX_IDGROUP_MMX_ID.IDX = MMX_WID == ID_BITS'GROUP_MMX_ID;
assign cmd_push_MMX = MMX_AWVALID & MMX_AWREADY;
assign cmd_push_MMX_IDMMX_IDX = cmd_push_MMX & AWmatch_MMX_IDMMX_IDX;
assign cmd_push_MMX_IDGROUP_MMX_ID.IDX = cmd_push_MMX & AWmatch_MMX_IDGROUP_MMX_ID.IDX;
assign cmd_pop_MMX = MMX_WVALID & MMX_WREADY & MMX_WLAST;
assign cmd_pop_MMX_IDMMX_IDX = cmd_pop_MMX & Wmatch_MMX_IDMMX_IDX;
assign cmd_pop_MMX_IDGROUP_MMX_ID.IDX = cmd_pop_MMX & Wmatch_MMX_IDGROUP_MMX_ID.IDX;
 
assign cmd_push_SSX = SSX_AWVALID & SSX_AWREADY;
assign cmd_pop_SSX = SSX_WVALID & SSX_WREADY & SSX_WLAST;
assign master_in_SSX = SSX_AWMSTR;
assign slave_in_MMX_IDMMX_IDX = MMX_AWSLV;
assign slave_in_MMX_IDGROUP_MMX_ID.IDX = MMX_AWSLV;
 
LOOP MX
always @(MMX_WID
or slave_out_MMX_IDMMX_IDX
)
always @(*)
begin
case (MMX_WID)
ID_MMX_IDMMX_IDX : MMX_WSLV = slave_out_MMX_IDMMX_IDX;
ID_BITS'GROUP_MMX_ID : MMX_WSLV = slave_out_MMX_IDGROUP_MMX_ID.IDX;
default : MMX_WSLV = SERR;
endcase
end
 
always @(MMX_WSLV
or master_out_SSX
)
always @(*)
begin
case (MMX_WSLV)
'dSX : MMX_WOK = master_out_SSX == 'dMX;
SLV_BITS'dSX : MMX_WOK = master_out_SSX == MSTR_BITS'dMX;
default : MMX_WOK = 1'b0;
endcase
end
128,26 → 120,26
ENDLOOP MX
LOOP MX
LOOP MMX_IDX
LOOP IX GROUP_MMX_ID.NUM
prgen_fifo #(SLV_BITS, CMD_DEPTH)
slave_fifo_MMX_IDMMX_IDX(
.clk(clk),
.reset(reset),
.push(cmd_push_MMX_IDMMX_IDX),
.pop(cmd_pop_MMX_IDMMX_IDX),
.din(slave_in_MMX_IDMMX_IDX),
.dout(slave_out_MMX_IDMMX_IDX),
.empty(slave_empty_MMX_IDMMX_IDX),
.full(slave_full_MMX_IDMMX_IDX)
);
slave_fifo_MMX_IDIX(
.clk(clk),
.reset(reset),
.push(cmd_push_MMX_IDIX),
.pop(cmd_pop_MMX_IDIX),
.din(slave_in_MMX_IDIX),
.dout(slave_out_MMX_IDIX),
.empty(slave_empty_MMX_IDIX),
.full(slave_full_MMX_IDIX)
);
 
ENDLOOP MMX_IDX
ENDLOOP MX
ENDLOOP IX
ENDLOOP MX
 
LOOP SX
prgen_fifo #(MSTR_BITS, 32)
LOOP SX
prgen_fifo #(MSTR_BITS, 32) //TBD SLV_DEPTH
master_fifo_SSX(
.clk(clk),
.reset(reset),
159,7 → 151,7
.full(master_full_SSX)
);
 
ENDLOOP SX
ENDLOOP SX
endmodule
 
/ahb_master/trunk/src/base/ic.v
28,11 → 28,16
//////////////////////////////////////////////////////////////////##>
 
OUTFILE PREFIX_ic.v
INCLUDE def_ic.txt
INCLUDE def_ic.txt
 
ITER MX
 
ITER SX SLAVE_NUM ##external slave ports don't include decerr slave
 
VERIFY (GROUP_MMX_ID.NUM > 0) ##Master MX does not have group for AXI IDs
VERIFY(UNIQUE(GONCAT(GROUP_MMX_ID ,))) ##Master MX IDs are not unique
 
 
module PREFIX_ic (PORTS);
 
input clk;
98,8 → 103,8
.MMX_AWGROUP_IC_AXI_CMD(MMX_AWGROUP_IC_AXI_CMD),
.MMX_WGROUP_IC_AXI_W(MMX_WGROUP_IC_AXI_W),
.SSX_WGROUP_IC_AXI_W(SSX_WGROUP_IC_AXI_W),
.SSX_AWVALID(SSX_AWVALID),
.SSX_AWREADY(SSX_AWREADY),
.SSX_AWVALID(SSX_AWVALID),
.SSX_AWREADY(SSX_AWREADY),
.SSX_AWMSTR(SSX_AWMSTR),
STOMP ,
);
/ahb_master/trunk/src/base/def_axi_master_static.txt
27,11 → 27,11
//// ////
//////////////////////////////////////////////////////////////////##>
 
INCLUDE def_axi_master_rand.txt
VERIFY (DATA_BITS <= 64) else stub supports 32 or 64 bits data bus
VERIFY (SIZE_BITS <= 3) else stub supports 32 or 64 bits data bus
SWAP.GLOBAL MODEL_NAME AXI master stub
 
VERIFY (DATA_BITS <= 64) ##stub supports 32 or 64 bits data bus
VERIFY (SIZE_BITS <= 3) ##stub supports 32 or 64 bits data bus
 
GROUP STUB_AXI_A is {
ID ID_BITS output
ADDR ADDR_BITS output
77,3 → 77,18
GROUP STUB_AXI_A prefix_AR
GROUP STUB_AXI_R prefix_R
}
 
GROUP AXI_MASTER_RAND is {
ahb_bursts SON(DEFAULT 0)
use_addr_base SON(DEFAULT 0)
len_min SON(DEFAULT 0)
len_max SON(DEFAULT 15)
size_min SON(DEFAULT 0)
size_max SON(DEFAULT 3)
addr_min SON(DEFAULT 0)
addr_max SON(DEFAULT {DATA_BITS{1'b1}})
}
 
SWAP ID_NUM GROUP_AXI_ID.NUM
/ahb_master/trunk/src/base/axi_master.v
125,8 → 125,7
 
INCLUDE def_axi_master.txt
 
ITER IX ID_NUM
ITER IDX ID_NUM
module PREFIX(PORTS);
 
`include "prgen_rand.v"
143,34 → 142,34
//random parameters
integer GROUP_AXI_MASTER_RAND = GROUP_AXI_MASTER_RAND.DEFAULT;
wire GROUP_STUB_AXI_IX;
wire idle_IX;
wire scrbrd_empty_IX;
wire GROUP_STUB_AXI_IDX;
wire idle_IDX;
wire scrbrd_empty_IDX;
 
 
always @(*)
begin
#FFD;
PREFIX_singleIX.GROUP_AXI_MASTER_RAND = GROUP_AXI_MASTER_RAND;
PREFIX_singleIDX.GROUP_AXI_MASTER_RAND = GROUP_AXI_MASTER_RAND;
end
assign idle = CONCAT(idle_IX &);
assign scrbrd_empty = CONCAT(scrbrd_empty_IX &);
assign idle = CONCAT(idle_IDX &);
assign scrbrd_empty = CONCAT(scrbrd_empty_IDX &);
CREATE axi_master_single.v
 
LOOP IX ID_NUM
PREFIX_single #(IX, IDIX_VAL, CMD_DEPTH)
PREFIX_singleIX(
LOOP IDX ID_NUM
PREFIX_single #(IDX, ID_BITS'GROUP_AXI_ID[IDX], CMD_DEPTH)
PREFIX_singleIDX(
.clk(clk),
.reset(reset),
.GROUP_STUB_AXI(GROUP_STUB_AXI_IX),
.idle(idle_IX),
.scrbrd_empty(scrbrd_empty_IX)
.GROUP_STUB_AXI(GROUP_STUB_AXI_IDX),
.idle(idle_IDX),
.scrbrd_empty(scrbrd_empty_IDX)
);
ENDLOOP IX
ENDLOOP IDX
 
IFDEF TRUE(ID_NUM==1)
179,24 → 178,27
ELSE TRUE(ID_NUM==1)
 
CREATE ic.v \\
DEFCMD(SWAP.GLOBAL PARENT PREFIX) \\
CREATE ic.v \\
DEFCMD(SWAP.GLOBAL CONST(PREFIX) PREFIX) \\
DEFCMD(SWAP.GLOBAL MASTER_NUM ID_NUM) \\
DEFCMD(SWAP.GLOBAL SLAVE_NUM 1) \\
DEFCMD(SWAP.GLOBAL CONST(ID_BITS) ID_BITS) \\
DEFCMD(SWAP.GLOBAL CONST(CMD_DEPTH) CMD_DEPTH) \\
DEFCMD(SWAP.GLOBAL CONST(DATA_BITS) DATA_BITS) \\
DEFCMD(SWAP.GLOBAL CONST(ADDR_BITS) ADDR_BITS)
LOOP IX ID_NUM
STOMP NEWLINE
DEFCMD(LOOP.GLOBAL MIX_IDX 1) \\
DEFCMD(SWAP.GLOBAL ID_MIX_ID0 IDIX_VAL)
ENDLOOP IX
DEFCMD(SWAP.GLOBAL CONST(ADDR_BITS) ADDR_BITS) \\
DEFCMD(SWAP.GLOBAL CONST(USER_BITS) 0)
LOOP IDX ID_NUM
STOMP NEWLINE
DEFCMD(GROUP.GLOBAL MIDX_ID overrides { ) \\
DEFCMD(GROUP_AXI_ID[IDX]) \\
DEFCMD(})
ENDLOOP IDX
 
PREFIX_ic PREFIX_ic(
.clk(clk),
.reset(reset),
.MIX_GROUP_STUB_AXI(GROUP_STUB_AXI_IX),
.MIDX_GROUP_STUB_AXI(GROUP_STUB_AXI_IDX),
.S0_GROUP_STUB_AXI(GROUP_STUB_AXI),
STOMP ,
222,7 → 224,7
begin
check_master_num("enable", master_num);
case (master_num)
IX : PREFIX_singleIX.enable = 1;
IDX : PREFIX_singleIDX.enable = 1;
endcase
end
endtask
229,7 → 231,7
 
task enable_all;
begin
PREFIX_singleIX.enable = 1;
PREFIX_singleIDX.enable = 1;
end
endtask
240,7 → 242,7
begin
check_master_num("write_single", master_num);
case (master_num)
IX : PREFIX_singleIX.write_single(addr, wdata);
IDX : PREFIX_singleIDX.write_single(addr, wdata);
endcase
end
endtask
252,7 → 254,7
begin
check_master_num("read_single", master_num);
case (master_num)
IX : PREFIX_singleIX.read_single(addr, rdata);
IDX : PREFIX_singleIDX.read_single(addr, rdata);
endcase
end
endtask
264,7 → 266,7
begin
check_master_num("check_single", master_num);
case (master_num)
IX : PREFIX_singleIX.check_single(addr, expected);
IDX : PREFIX_singleIDX.check_single(addr, expected);
endcase
end
endtask
276,7 → 278,7
begin
check_master_num("write_and_check_single", master_num);
case (master_num)
IX : PREFIX_singleIX.write_and_check_single(addr, data);
IDX : PREFIX_singleIDX.write_and_check_single(addr, data);
endcase
end
endtask
289,7 → 291,7
begin
check_master_num("insert_wr_cmd", master_num);
case (master_num)
IX : PREFIX_singleIX.insert_wr_cmd(addr, len, size);
IDX : PREFIX_singleIDX.insert_wr_cmd(addr, len, size);
endcase
end
endtask
302,7 → 304,7
begin
check_master_num("insert_rd_cmd", master_num);
case (master_num)
IX : PREFIX_singleIX.insert_rd_cmd(addr, len, size);
IDX : PREFIX_singleIDX.insert_rd_cmd(addr, len, size);
endcase
end
endtask
313,7 → 315,7
begin
check_master_num("insert_wr_data", master_num);
case (master_num)
IX : PREFIX_singleIX.insert_wr_data(wdata);
IDX : PREFIX_singleIDX.insert_wr_data(wdata);
endcase
end
endtask
326,7 → 328,7
begin
check_master_num("insert_wr_incr_data", master_num);
case (master_num)
IX : PREFIX_singleIX.insert_wr_incr_data(addr, len, size);
IDX : PREFIX_singleIDX.insert_wr_incr_data(addr, len, size);
endcase
end
endtask
337,7 → 339,7
begin
check_master_num("insert_rand_chk", master_num);
case (master_num)
IX : PREFIX_singleIX.insert_rand_chk(burst_num);
IDX : PREFIX_singleIDX.insert_rand_chk(burst_num);
endcase
end
endtask
345,7 → 347,6
task insert_rand;
input [31:0] burst_num;
ITER IDX ID_NUM
reg [31:0] burst_numIDX;
integer remain;
begin
/ahb_master/trunk/src/base/def_ahb_master.txt
27,7 → 27,7
//// ////
//////////////////////////////////////////////////////////////////##>
 
REQUIRE(1.3)
REQUIRE(1.4)
 
INCLUDE def_axi_master_rand.txt
INCLUDE def_axi2ahb.txt
/ahb_master/trunk/src/base/axi_master_single.v
36,7 → 36,7
parameter MASTER_NUM = 0;
parameter MASTER_ID = 0;
parameter MASTER_PEND = 0;
 
CREATE prgen_rand.v DEFCMD(DEFINE NOT_IN_LIST)
`include "prgen_rand.v"
50,7 → 50,6
(MAX_CMDS <= 256) ? 8 :
(MAX_CMDS <= 512) ? 9 : 0; //0 is ilegal
input clk;
input reset;
75,6 → 74,8
reg rd_enable = 0;
reg wr_enable = 0;
reg wait_for_write = 0;
reg err_on_wr_resp = 1;
reg err_on_rd_resp = 1;
reg scrbrd_enable = 0;
reg [LEN_BITS-1:0] wvalid_cnt;
225,7 → 226,7
assign AWADDR = wr_cmd_addr;
assign AWLEN = wr_cmd_len;
assign AWSIZE = wr_cmd_size;
assign AWID = MASTER_ID;
assign AWID = MASTER_ID;
assign AWBURST = 2'd1; //INCR only
assign AWCACHE = 4'd0; //not supported
assign AWPROT = 4'd0; //not supported
249,7 → 250,7
assign ARLOCK = 2'd0; //not supported
 
assign rd_fifo_data_in = RDATA;
assign rd_fifo_resp_in = BRESP;
assign rd_fifo_resp_in = RRESP;
assign wr_data_bytes = 1'b1 << wr_data_size;
 
548,6 → 549,8
rd_fifo_pop = 1;
@(posedge clk); #FFD;
rd_fifo_pop = 0;
if ((resp != 2'b00) && (err_on_rd_resp))
$display("PREFIX_MASTER%0d: RRESP_ERROR: Received RRESP 2'b%0b.\tTime: %0d ns.", MASTER_NUM, resp, $time);
end
endtask
582,6 → 585,8
wr_resp_pop = 1;
@(posedge clk); #FFD;
wr_resp_pop = 0;
if ((resp != 2'b00) && (err_on_wr_resp))
$display("PREFIX_MASTER%0d: BRESP_ERROR: Received BRESP 2'b%0b.\tTime: %0d ns.", MASTER_NUM, resp, $time);
end
endtask
638,7 → 643,7
begin
read_single_ack(addr, rdata, resp);
if (rdata !== expected)
$display("MASTER%0d: CHK_SINGLE_ERROR: Address: 0x%0h, Expected: 0x%0h, Received: 0x%0h.\tTime: %0d ns.", MASTER_NUM, addr, expected, rdata, $time);
$display("PREFIX_MASTER%0d: CHK_SINGLE_ERROR: Address: 0x%0h, Expected: 0x%0h, Received: 0x%0h.\tTime: %0d ns.", MASTER_NUM, addr, expected, rdata, $time);
end
endtask
678,7 → 683,7
rdata_masked = rdata & mask;
if (expected_data !== rdata_masked)
$display("MASTER%0d: SCRBRD_ERROR: Address: 0x%0h, Expected: 0x%0h, Received: 0x%0h.\tTime: %0d ns.", MASTER_NUM, addr, expected_data, rdata, $time);
$display("PREFIX_MASTER%0d: SCRBRD_ERROR: Address: 0x%0h, Expected: 0x%0h, Received: 0x%0h.\tTime: %0d ns.", MASTER_NUM, addr, expected_data, rdata, $time);
end
endtask
 
/ahb_master/trunk/src/base/axi2ahb_cmd.v
1,9 → 1,37
/////////////////////////////////////////////////////////////////////
//// ////
//// Author: Eyal Hochberg ////
//// eyal@provartec.com ////
//// ////
//// Downloaded from: http://www.opencores.org ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2010 Provartec LTD ////
//// www.provartec.com ////
//// info@provartec.com ////
//// ////
//// 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.////
//// ////
//// 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. http://www.gnu.org/licenses/lgpl.html ////
//// ////
/////////////////////////////////////////////////////////////////////
 
OUTFILE PREFIX_axi2ahb_cmd.v
OUTFILE PREFIX_cmd.v
INCLUDE def_axi2ahb.txt
 
module PREFIX_axi2ahb_cmd (PORTS);
module PREFIX_cmd (PORTS);
 
input clk;
input reset;
/ahb_master/trunk/src/base/axi2ahb_ctrl.v
28,9 → 28,9
/////////////////////////////////////////////////////////////////////
 
INCLUDE def_axi2ahb.txt
OUTFILE PREFIX_axi2ahb_ctrl.v
OUTFILE PREFIX_ctrl.v
 
module PREFIX_axi2ahb_ctrl (PORTS);
module PREFIX_ctrl (PORTS);
 
 
input clk;
/ahb_master/trunk/src/base/ahb_master.v
151,8 → 151,9
DEFCMD(SWAP.GLOBAL CONST(ID_BITS) ID_BITS) \\
DEFCMD(SWAP.GLOBAL CONST(ADDR_BITS) ADDR_BITS) \\
DEFCMD(SWAP.GLOBAL CONST(DATA_BITS) DATA_BITS) \\
DEFCMD(SWAP.GLOBAL CONST(ID_NUM) 1) \\
DEFCMD(SWAP.GLOBAL CONST(ID0_VAL) ID_BITS'b0)
DEFCMD(GROUP.USER AXI_ID overrides {) \\
DEFCMD(b0) \\
DEFCMD(})
PREFIX_axi_master axi_master(
.clk(clk),
.reset(reset),
164,7 → 165,7
 
CREATE axi2ahb.v \\
DEFCMD(SWAP.GLOBAL CONST(PREFIX) PREFIX) \\
DEFCMD(SWAP.GLOBAL CONST(PREFIX) PREFIX_axi2ahb) \\
DEFCMD(SWAP.GLOBAL CONST(CMD_DEPTH) 4) \\
DEFCMD(SWAP.GLOBAL CONST(ADDR_BITS) ADDR_BITS) \\
DEFCMD(SWAP.GLOBAL CONST(DATA_BITS) DATA_BITS) \\
/ahb_master/trunk/src/base/def_axi2ahb.txt
27,14 → 27,16
//// ////
//////////////////////////////////////////////////////////////////##>
 
REQUIRE(1.4)
 
INCLUDE def_axi2ahb_static.txt
 
SWAP.GLOBAL #FFD #1 ## flip-flop delay
SWAP.GLOBAL #FFD #1 ## flip-flop delay
 
SWAP.USER PREFIX axi2ahb ## prefix for all modules and file names
SWAP.USER PREFIX axi2ahb ##Prefix for all modules and file names
 
SWAP.USER CMD_DEPTH 4 ## number of AXI command FIFO
SWAP.USER CMD_DEPTH 4 ##Number of AXI command FIFO
 
SWAP.USER ADDR_BITS 24 ## AXI and AHB address bits
SWAP.USER DATA_BITS 32 ## AXI and AHB data bits
SWAP.USER ID_BITS 4 ## AXI ID bits
SWAP.USER ADDR_BITS 24 ##AXI and AHB address bits
SWAP.USER DATA_BITS 32 ##AXI and AHB data bits
SWAP.USER ID_BITS 4 ##AXI ID bits
/ahb_master/trunk/src/base/axi2ahb_rd_fifo.v
28,9 → 28,9
/////////////////////////////////////////////////////////////////////
 
INCLUDE def_axi2ahb.txt
OUTFILE PREFIX_axi2ahb_rd_fifo.v
OUTFILE PREFIX_rd_fifo.v
 
module PREFIX_axi2ahb_rd_fifo (PORTS);
module PREFIX_rd_fifo (PORTS);
 
parameter FIFO_LINES = EXPR(2 * 16); //double buffer of max burst
parameter RESP_SLVERR = 2'b10;
/ahb_master/trunk/src/base/ic_dec.v
32,10 → 32,6
ITER MX
ITER SX
 
LOOP MX
ITER MMX_IDX
ENDLOOP MX
module PREFIX_ic_dec (PORTS);
 
input [ADDR_BITS-1:0] MMX_AADDR;
49,12 → 45,17
reg [SLV_BITS-1:0] MMX_ASLV;
reg MMX_AIDOK;
LOOP MX
LOOP MX
always @(MMX_AADDR or MMX_AIDOK)
begin
begin
IFDEF TRUE(SLAVE_NUM==1)
case (MMX_AIDOK)
1'b1 : MMX_ASLV = SLV_BITS'd0;
ELSE TRUE(SLAVE_NUM==1)
case ({MMX_AIDOK, MMX_AADDR[DEC_MSB:DEC_LSB]})
{1'b1, BIN(SX SLV_BITS)} : MMX_ASLV = 'dSX;
default : MMX_ASLV = 'dSERR;
{1'b1, BIN(SX SLV_BITS)} : MMX_ASLV = SLV_BITS'dSX;
ENDIF TRUE(SLAVE_NUM==1)
default : MMX_ASLV = SLV_BITS'dSERR;
endcase
end
 
61,14 → 62,14
always @(MMX_AID)
begin
case (MMX_AID)
ID_MMX_IDMMX_IDX : MMX_AIDOK = 1'b1;
ID_BITS'GROUP_MMX_ID : MMX_AIDOK = 1'b1;
default : MMX_AIDOK = 1'b0;
endcase
end
ENDLOOP MX
ENDLOOP MX
endmodule
endmodule
 
 
 

powered by: WebSVN 2.1.0

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