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

Subversion Repositories hssdrc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 2 to Rev 3
    Reverse comparison

Rev 2 → Rev 3

trunk/testbench/hssrdc_driver_cbs_class.sv Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/testbench/hssrdc_scoreboard_class.sv =================================================================== --- trunk/testbench/hssrdc_scoreboard_class.sv (revision 2) +++ trunk/testbench/hssrdc_scoreboard_class.sv (nonexistent) @@ -1,142 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:54:00 $ -// -// Workfile : hssrdc_scoreboard_class.sv -// -// Description : scoreboard for test read transaction -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - - -`include "tb_define.svh" - -`include "message_class.sv" -`include "hssrdc_driver_cbs_class.sv" - -class hssdrc_scoreboard_class extends hssrdc_driver_cbs_class; - - sdram_tr_mbx out_mbx; - message_class msg; - - event done; - - function new (message_class msg, ref event done); - - this.msg = msg; - - this.done = done; - - endfunction - - int checked_tr_num; - int check_err_num; - - // - // - // - - task start (); - checked_tr_num = 0; - check_err_num = 0; - endtask - - // - // - // - - virtual task post_ReadData (input realtime t, sdram_transaction_class tr); - tb_data_t golden_data2cmp; - tb_data_t data2cmp; - - tb_chid_t golden_chid2cmp; - tb_chid_t chid2cmp; - - tb_datam_t datam; - - int burst; - - string str; - begin - - burst = tr.burst + 1; - - golden_chid2cmp = tr.chid; - - for (int i = 0; i < burst; i++) begin - - datam = tr.wdatam [i]; - - data2cmp = MaskData(tr.rdata [i], datam); - golden_data2cmp = MaskData(tr.wdata [i], datam); - - chid2cmp = tr.rchid [i]; - - if (data2cmp !== golden_data2cmp) begin - str = $psprintf("data compare error at ba = %0d, rowa = %0d, cola = %0d : ", tr.ba, tr.rowa, tr.cola); - str = {str, ($psprintf("write data %h : read data %h", golden_data2cmp, data2cmp))}; - msg.err(str); - - check_err_num++; - end - - if (chid2cmp !== golden_chid2cmp) begin - str = $psprintf("chid compare error at ba = %0d, rowa = %0d, cola = %0d : ", tr.ba, tr.rowa, tr.cola); - str = {str, ($psprintf("write chid %h : read chid %h", golden_chid2cmp, chid2cmp))}; - msg.err(str); - - check_err_num++; - end - - end - - checked_tr_num++; - -> done; - end - endtask - - // - // - // - - function data_t MaskData (input tb_data_t data, tb_datam_t datam); - if (datam == 0) - MaskData = data; - else begin - for (int m = 0; m < $size(datam); m++) begin - for (int b = 0; b < 8; b++) begin - MaskData[8*m + b] = data [8*m + b] & ~datam[m]; - end - end - end - endfunction - -endclass
trunk/testbench/hssrdc_scoreboard_class.sv Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/testbench/sdram_transaction_class.sv =================================================================== --- trunk/testbench/sdram_transaction_class.sv (revision 2) +++ trunk/testbench/sdram_transaction_class.sv (nonexistent) @@ -1,220 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:54:00 $ -// -// Workfile : sdram_transaction_class.sv -// -// Description : sdram transaction structure -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - - -`include "hssdrc_define.vh" -`include "tb_define.svh" - -`ifndef __SDRAM_TRANSACTION_CLASS_SV__ - -`define __SDRAM_TRANSACTION_CLASS_SV__ - - class sdram_transaction_class; - - // transaction id - int id; - // transacton type for driver - tr_type_e_t tr_type ; - // input sdram path - rand tb_ba_t ba ; - rand tb_rowa_t rowa ; - rand tb_cola_t cola ; - rand tb_burst_t burst ; - rand tb_chid_t chid ; - // input data path - rand tb_data_t wdata [0:cBurstMaxValue-1]; - tb_datam_t wdatam [0:cBurstMaxValue-1]; - // output data path - tb_data_t rdata [0:cBurstMaxValue-1]; - tb_chid_t rchid [0:cBurstMaxValue-1]; - - // random generate controls - int burst_random_mode = 0; - int address_random_mode = 0; - // used in random generate variables - tb_ba_t last_used_ba; - tb_rowa_t last_used_rowa; - - - function new (int id = 0, tr_type_e_t tr_type = cTR_WRITE, int ba = 0, rowa = 0, cola = 0, burst = 1, chid = 0); - - this.id = id; - this.tr_type = tr_type; - this.ba = ba; - this.rowa = rowa; - this.cola = cola; - this.burst = burst - 1; - this.chid = chid; - - endfunction - - // - // function to generate linear data packet - // - - function void GetLinearPacket; - data_t tmp_data; - begin - - tmp_data = {ba, rowa, this.cola}; - - for (int i = 0; i <= burst; i++) - wdata [i] = tmp_data + i + 1; - - wdatam = '{default : 0}; - end - endfunction - - // - // - // - - function void GetRandomPacket; - data_t tmp_data; - begin - - assert ( std::randomize(wdata)) else $error ("random packet generate"); - - wdatam = '{default : 0}; - - end - endfunction - - // - // randomize callback function to store transaction addres's - // - function void post_randomize(); - last_used_ba = ba; - last_used_rowa = rowa; - endfunction - - // - // constraint for use for performance measuring - // - - // burst constraint - - // mode 0 : any birst, no cola allign - - // mode 1 : fixed burst = 1, cola allign - constraint burst_constraint_1 { (burst_random_mode == 1) -> burst == 0; } - // mode 2 : fixed burst = 2, cola allign - constraint burst_constraint_2 { (burst_random_mode == 2) -> burst == 1; } - // mode 3 : fixed burst = 4, cola allign - constraint burst_constraint_3 { (burst_random_mode == 3) -> burst == 3; } - // mode 4 : fixed burst == 8, cola allign - constraint burst_constraint_4 { (burst_random_mode == 4) -> burst == 7; } - // mode 5 : fixed burst == 16, cola allign - constraint burst_constraint_5 { (burst_random_mode == 5) -> burst == 15; } - // mode 6 : max performance burst, cola allign - constraint burst_constraint_6 { (burst_random_mode == 6) -> burst inside {0, 1, 3, 7, 15}; } - - // cola constraint - constraint cola_constraint { (burst_random_mode != 0) -> - (burst == 1) -> (cola[0] == 0); - (burst == 3) -> (cola[1:0] == 0); - (burst == 7) -> (cola[2:0] == 0); - (burst == 15) -> (cola[3:0] == 0); - } - - constraint burst_order {solve burst before cola; } - - // address constraint - - // mode 0 : same bank same row - constraint address_constraint_0 { (address_random_mode == 0) -> { - (ba == last_used_ba); - (rowa == last_used_rowa); - } - } - // mode 1 : same bank - constraint address_constraint_1 { (address_random_mode == 1) -> { - (ba == last_used_ba); - (rowa != last_used_rowa); - } - } - // mode 2 : any bank same row - constraint address_constraint_2 { (address_random_mode == 2) -> { - (ba != last_used_ba); - (rowa == last_used_rowa); - } - } - // mode 3 : linear bank same row - constraint address_constraint_3 { (address_random_mode == 3) -> { - (last_used_ba == 0) -> (ba == 1); - (last_used_ba == 1) -> (ba == 2); - (last_used_ba == 2) -> (ba == 3); - (last_used_ba == 3) -> (ba == 0); - (rowa == last_used_rowa); - } - } - // mode 4 : any bank any row - constraint address_constraint_4 { (address_random_mode == 4) -> { - (ba != last_used_ba); - (rowa != last_used_rowa); - } - } - // mode 5 : linear bank any row - constraint address_constraint_5 { (address_random_mode == 5) -> { - (last_used_ba == 0) -> (ba == 1); - (last_used_ba == 1) -> (ba == 2); - (last_used_ba == 2) -> (ba == 3); - (last_used_ba == 3) -> (ba == 0); - (rowa != last_used_rowa); - } - } - // mode 6 : ba varies more often than rowa - constraint address_constraint_6 { (address_random_mode == 6) -> { - ba dist { (ba == last_used_ba) := 1, (ba != last_used_ba) :/5}; // 1/6 const ba - rowa dist { (rowa == last_used_rowa) := 5, (rowa != last_used_rowa) :/1}; // 5/6 const rowa - } - } - // mode 7 : ba varies less often than rowa - constraint address_constraint_7 { (address_random_mode == 7) -> { - ba dist { (ba == last_used_ba) := 3, (ba != last_used_ba) :/1}; // 75% const ba - rowa dist { (rowa == last_used_rowa) := 1, (rowa != last_used_rowa) :/3}; // 25% const rowa - } - } - - endclass - // - // mailbox for connet agent with driver - // - typedef mailbox #(sdram_transaction_class) sdram_tr_mbx; - -`endif
trunk/testbench/sdram_transaction_class.sv Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/testbench/hssdrc_driver_class.sv =================================================================== --- trunk/testbench/hssdrc_driver_class.sv (revision 2) +++ trunk/testbench/hssdrc_driver_class.sv (nonexistent) @@ -1,351 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:54:00 $ -// -// Workfile : hssdrc_driver_class.sv -// -// Description : low level API driver for hssdrc_controller -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - - -`include "hssdrc_tb_sys_if.vh" - -`include "hssdrc_define.vh" - -`include "tb_define.svh" - -`include "hssrdc_driver_cbs_class.sv" - -`ifndef __HSSDRC_DRIVER_SV__ - - `define __HSSDRC_DRIVER_SV__ - - class hssrdc_driver_class; - - // callback quene - hssrdc_driver_cbs_class cbs[$]; - - // mailboxes to connect with transaction agent - sdram_tr_mbx in_mbx; - - // mailbox for connect command path with data path of this driver - sdram_tr_mbx wdata_mbx; - sdram_tr_mbx rdata_mbx; - - // - virtual hssdrc_tb_sys_if sys_if; - - // acknowledge mailbox for agent. used in locked transaction only - sdram_tr_ack_mbx done_mbx; - - // feedback to tb for waiting event - event write_done; - event read_done; - - // driver work modes - bit random_delay_mode = 0; - bit debug = 0; - - // - // - // - - function new (virtual hssdrc_tb_sys_if sys_if, sdram_tr_mbx in_mbx, sdram_tr_ack_mbx done_mbx); - - this.sys_if = sys_if; - - this.in_mbx = in_mbx; - - this.done_mbx = done_mbx; - - // internal not sized mailboxes : all must be controlled via in_mbx, out_mbx size - wdata_mbx = new; - rdata_mbx = new; - - endfunction - - // - // init interface task - // - - task init; - sys_if.cb.write <= 1'b0; - sys_if.cb.read <= 1'b0; - sys_if.cb.refr <= 1'b0; - sys_if.cb.cola <= '0; - sys_if.cb.rowa <= '0; - sys_if.cb.ba <= '0; - sys_if.cb.chid_i <= '0; - sys_if.cb.burst <= '0; - sys_if.cb.wdata <= '0; - sys_if.cb.wdatam <= '0; - endtask - - // - // start driver task - // - - task run; - init (); - fork - CommandDriver (); - WriteDataDriver (); - ReadDataDriver (); - join_none; - endtask - - // - // stop driver task - // - - task stop (); - disable this.CommandDriver; - disable this.WriteDataDriver; - disable this.ReadDataDriver; - endtask - - //----------------------------------------------------------------------- - // command driver - //----------------------------------------------------------------------- - - task CommandDriver; - sdram_transaction_class tr; - - bit [4:0] delay; // max delay is 32 bit - - begin - - @(sys_if.cb); - forever begin - - // syncronize mailbox to clock - if ( !in_mbx.try_get(tr) ) begin - @(sys_if.cb); - continue; - end - - if (debug) begin - if ((tr.tr_type == cTR_READ) || (tr.tr_type == cTR_READ_LOCKED)) - $display("%0t cmd get READ transaction id = %0d", $time, tr.id); - else if ((tr.tr_type == cTR_WRITE) || (tr.tr_type == cTR_WRITE_LOCKED)) - $display("%0t cmd get WRITE transaction id = %0d", $time, tr.id); - end - - if (random_delay_mode) begin - assert (std::randomize(delay) with {delay dist {0 := 1, !0 :/ 2};}) else - $error ("random delay generate error"); - - repeat (delay) @(sys_if.cb); - end - - - // set command on interface - SetCommand(tr); - - // if need callbacks - foreach ( cbs [i] ) cbs[i].post_Command ($realtime); - - // set command for write/read drivers - case (tr.tr_type) - cTR_WRITE, cTR_WRITE_LOCKED : wdata_mbx.put (tr); - cTR_READ , cTR_READ_LOCKED : rdata_mbx.put (tr); - endcase - - // for locked transactions wait done and set acknowledge - case (tr.tr_type) - cTR_WRITE_LOCKED : begin - @(write_done); - done_mbx.put (cTR_WRITE_LOCKED); - end - cTR_READ_LOCKED : begin - @(read_done); - done_mbx.put(cTR_READ_LOCKED); - end - cTR_REFR_LOCKED : begin - done_mbx.put (cTR_WRITE_LOCKED); - end - endcase - - end - end - endtask - - // - // - // - - task SetCommand (sdram_transaction_class tr); - - case (tr.tr_type) - cTR_WRITE, cTR_WRITE_LOCKED : begin - sys_if.cb.write <= 1'b1; - sys_if.cb.read <= 1'b0; - sys_if.cb.refr <= 1'b0; - end - cTR_READ, cTR_READ_LOCKED : begin - sys_if.cb.write <= 1'b0; - sys_if.cb.read <= 1'b1; - sys_if.cb.refr <= 1'b0; - end - cTR_REFR, cTR_REFR_LOCKED : begin - sys_if.cb.write <= 1'b0; - sys_if.cb.read <= 1'b0; - sys_if.cb.refr <= 1'b1; - end - endcase - - sys_if.cb.rowa <= tr.rowa; - sys_if.cb.cola <= tr.cola; - sys_if.cb.ba <= tr.ba; - sys_if.cb.burst <= tr.burst; - sys_if.cb.chid_i <= tr.chid; - - do - @(sys_if.cb); - while (sys_if.cb.ready != 1'b1); - - sys_if.cb.write <= 1'b0; - sys_if.cb.read <= 1'b0; - sys_if.cb.refr <= 1'b0; - - endtask - - //----------------------------------------------------------------------- - // write data driver - //----------------------------------------------------------------------- - - task WriteDataDriver; - - sdram_transaction_class tr; - int num; - - begin - - forever begin - wdata_mbx.get (tr); - - if (debug) - $display("%0t write driver get transaction id = %0d", $time, tr.id); - - num = tr.burst + 1; - - // set data - for (int i = 0; i < num; i++) - SetWrData (tr.wdata [i] , tr.wdatam [i]); - - -> write_done; - - if (debug) - $display("%0t write driver done transaction id = %0d", $time, tr.id); - - foreach ( cbs[i] ) cbs[i].post_WriteData($realtime, tr); - - end - end - endtask - - // - // - // -`ifndef HSSDRC_COMBINATIVE_USE_WDATA - task SetWrData ( input data_t data, datam_t datam); - sys_if.cb.wdata <= data; - sys_if.cb.wdatam <= datam; - - do - @(sys_if.cb); - while (sys_if.cb.use_wdata != 1'b1); - endtask -`else - task SetWrData ( input data_t data, datam_t datam); - do - @(sys_if.cb); - while (sys_if.cb.use_wdata != 1'b1); - - sys_if.cb.wdata <= data; - sys_if.cb.wdatam <= datam; - endtask -`endif - //----------------------------------------------------------------------- - // read part of driver - //----------------------------------------------------------------------- - - task ReadDataDriver; - - sdram_transaction_class tr; - int num; - - begin - forever begin - rdata_mbx.get (tr); - - if (debug) - $display("%0t read driver get transaction id = %0d", $time, tr.id); - - num = tr.burst + 1; - - for (int i = 0; i < num; i++) - GetRdData (tr.rdata [i], tr.rchid [i]); - - -> read_done; - - if (debug) - $display("%0t read driver done transaction id = %0d", $time, tr.id); - - foreach ( cbs[i] ) cbs[i].post_ReadData($realtime, tr); - - end - end - endtask - - // - // - // - - task GetRdData (output data_t data, chid_t chid); - - do - @(sys_if.cb); - while (sys_if.cb.vld_rdata != 1'b1); - - data = sys_if.cb.rdata; - chid = sys_if.cb.chid_o; - - endtask - - // - // - // - - endclass - -`endif
trunk/testbench/hssdrc_driver_class.sv Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/testbench/hssrdc_bandwidth_monitor_class.sv =================================================================== --- trunk/testbench/hssrdc_bandwidth_monitor_class.sv (revision 2) +++ trunk/testbench/hssrdc_bandwidth_monitor_class.sv (nonexistent) @@ -1,257 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:54:00 $ -// -// Workfile : hssrdc_bandwidth_monitor_class.sv -// -// Description : bandwidth monitor measurement class -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -`include "hssdrc_define.vh" -`include "hssdrc_timing.vh" -`include "hssdrc_tb_sys_if.vh" - -`include "sdram_transaction_class.sv" -`include "hssrdc_driver_cbs_class.sv" - - -`ifndef __HSSDRC_BANDWIDTH_MONITOR_CLASS__ - - `define __HSSDRC_BANDWIDTH_MONITOR_CLASS__ - - class hssdrc_bandwidth_monitor_class extends hssrdc_driver_cbs_class; - - virtual hssdrc_tb_sys_if sys_if; - - // bandwidth measurement FSM - enum {idle, wait_start, work} state = idle; - - // timestamps - realtime end_time; - realtime start_time; - - // word transfer counters - int unsigned wr_word_num; - int unsigned rd_word_num; - - // bandwidth measurement itself - real write_bandwidth ; - real read_bandwidth ; - real bandwidth ; - - real write_bandwidth_percent ; - real read_bandwidth_percent ; - real bandwidth_percent ; - - // semaphore to controll access to variables - semaphore sem; - - // bandwidth measurement parameters - real mbps_mfactor; - real max_bandwidth; - - // tb syncronization - int measured_tr_num = 0; - event done; - - function new (virtual hssdrc_tb_sys_if sys_if, ref event done); - sem = new (1); - - this.sys_if = sys_if; - - this.done = done; - endfunction - - - // - // function to start measurement process - // - - task start(); - - sem.get (1) ; - - // set begin - state = wait_start; - - // clear all counters - end_time = 0ns; - start_time = 0ns; - - wr_word_num = 0; - rd_word_num = 0; - - measured_tr_num = 0; - - sem.put (1) ; - endtask - - // - // function to stop measurement process - // - - task stop(); - sem.get (1); - - state = idle; - count_bandwidth(); - - sem.put (1); - - endtask - - // - // callback for command part of hssdrc_driver_class - // - - task post_Command (input realtime t); - endtask - - // - // callback for write part of hssdrc_driver_class - // - - task post_WriteData (input realtime t, sdram_transaction_class tr); - int burst; - begin - - burst = tr.burst + 1; - - sem.get (1); - - if (state == wait_start) begin - start_time = t; - state = work; - end - else if (state == work) begin - wr_word_num += burst; - end_time = t; - end - - measured_tr_num++; - -> done; - - sem.put (1); - end - endtask - - // - // callback for read part of hssdrc_driver_class - // - - task post_ReadData ( input realtime t, sdram_transaction_class tr); - int burst; - begin - - burst = tr.burst + 1; - - sem.get (1); - - if (state == wait_start) begin - start_time = t; - state = work; - end - else if (state == work) begin - rd_word_num += burst; - end_time = t; - end - - measured_tr_num++; - - -> done; - - sem.put (1); - end - endtask - - // - // measurement count function bwth = mbps_mfactor*num/(end_time - start_time); - // - - function void count_bandwidth(); - realtime delta; - int unsigned wrrd_word_num; - begin - - delta = (end_time - start_time); - - wrrd_word_num = wr_word_num + rd_word_num; - - write_bandwidth = (wr_word_num/delta)*mbps_mfactor; - read_bandwidth = (rd_word_num/delta)*mbps_mfactor; - bandwidth = (wrrd_word_num/delta)*mbps_mfactor; - - write_bandwidth_percent = write_bandwidth*100.0/max_bandwidth ; - read_bandwidth_percent = read_bandwidth *100.0/max_bandwidth ; - bandwidth_percent = bandwidth *100.0/max_bandwidth ; - - end - endfunction - - // - // task to get multiplicatin factor for counters - // - - task count_mbps_mfactor (int bytes_in_kilobytes) ; - realtime delta; - realtime scale; - begin - // define current timeunit value - delta = $realtime; - #1; - delta = $realtime - delta; - - // define time scale factor - scale = 1s/delta; - - // kilobytes - mbps_mfactor = real'(scale)/(bytes_in_kilobytes); - - // megabytes - mbps_mfactor = mbps_mfactor/(bytes_in_kilobytes); - - mbps_mfactor = mbps_mfactor*pDatamBits; - - // define max bandwwidth : 1 world per cycle period - @(sys_if.cb); - delta = $realtime; - @(sys_if.cb); - delta = $realtime - delta; - - max_bandwidth = (1/delta)*mbps_mfactor; - - end - endtask - - endclass - -`endif
trunk/testbench/hssrdc_bandwidth_monitor_class.sv Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/testbench/tb_top.sv =================================================================== --- trunk/testbench/tb_top.sv (revision 2) +++ trunk/testbench/tb_top.sv (nonexistent) @@ -1,182 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:54:00 $ -// -// Workfile : tb_top.sv -// -// Description : testbench top level -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - - -`include "hssdrc_timescale.vh" -`include "hssdrc_define.vh" -`include "hssdrc_timing.vh" -`include "hssdrc_tb_sys_if.vh" - -module tb_top; - - parameter cPeriod = 1000.0/pClkMHz; - parameter cHalfPeriod = cPeriod/2.0; - - wire [pDataBits-1:0] dq; - wire [pDatamBits-1:0] dqm; - wire [pSdramAddrBits-1 :0] addr; - wire [pBaBits-1 :0] ba; - wire cke ; - wire cs_n ; - wire ras_n ; - wire cas_n ; - wire we_n ; - - logic sys_write; - logic sys_read ; - logic sys_refr ; - rowa_t sys_rowa ; - cola_t sys_cola ; - ba_t sys_ba ; - burst_t sys_burst ; - chid_t sys_chid_i; - data_t sys_wdata ; - datam_t sys_wdatam; - logic sys_ready ; - logic sys_use_wdata ; - logic sys_vld_rdata ; - chid_t sys_chid_o ; - data_t sys_rdata ; - - - bit clk_main ; - bit clk; - bit nclk; - - bit reset ; - bit sclr ; - - hssdrc_tb_sys_if sys_if (clk, reset, sclr); - - assign sys_write = sys_if.write ; - assign sys_read = sys_if.read ; - assign sys_refr = sys_if.refr ; - assign sys_rowa = sys_if.rowa ; - assign sys_cola = sys_if.cola ; - assign sys_ba = sys_if.ba ; - assign sys_burst = sys_if.burst ; - assign sys_chid_i = sys_if.chid_i; - assign sys_wdata = sys_if.wdata ; - assign sys_wdatam = sys_if.wdatam; - - assign sys_if.ready = sys_ready ; - assign sys_if.use_wdata = sys_use_wdata ; - assign sys_if.vld_rdata = sys_vld_rdata ; - assign sys_if.chid_o = sys_chid_o ; - assign sys_if.rdata = sys_rdata ; - - - mt48lc2m32b2 sdram_chip ( - .Dq (dq ), - .Addr (addr ), - .Ba (ba ), - .Clk (nclk ), - .Cke (cke ), - .Cs_n (cs_n ), - .Ras_n (ras_n), - .Cas_n (cas_n), - .We_n (we_n ), - .Dqm (dqm ) - ); - - sdram_interpretator inter ( - .ba (ba), - .cs_n (cs_n ), - .ras_n(ras_n), - .cas_n(cas_n), - .we_n (we_n ), - .a10 (addr [10] ) - ); - - hssdrc_top top( - .clk (clk ), - .reset (reset), - .sclr (sclr ), - // - .sys_write (sys_write ), - .sys_read (sys_read ), - .sys_refr (sys_refr ), - .sys_rowa (sys_rowa ), - .sys_cola (sys_cola ), - .sys_ba (sys_ba ), - .sys_burst (sys_burst ), - .sys_chid_i (sys_chid_i ), - .sys_wdata (sys_wdata ), - .sys_wdatam (sys_wdatam ), - .sys_ready (sys_ready ), - .sys_use_wdata (sys_use_wdata), - .sys_vld_rdata (sys_vld_rdata), - .sys_chid_o (sys_chid_o ), - .sys_rdata (sys_rdata ), - // - .dq (dq ), - .dqm (dqm ), - .addr (addr ), - .ba (ba ), - .cke (cke ), - .cs_n (cs_n ), - .ras_n (ras_n), - .cas_n (cas_n), - .we_n (we_n ) - ); - - initial begin : clock_generator - clk_main = 1'b0; - #(cHalfPeriod); - forever clk_main = #(cHalfPeriod) ~clk_main; - end - - always_comb begin - clk <= clk_main; - nclk <= #2 ~clk_main; // model output buffer delay - end - - assign sclr = 1'b0; - - initial begin : reset_generator - reset = 1'b1; - - repeat (4) @(posedge clk); - @(negedge clk); - - reset = 1'b0; - end - - tb_prog prog (sys_if.tb); - -endmodule
trunk/testbench/tb_top.sv Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/testbench/sdram_interpretator.sv =================================================================== --- trunk/testbench/sdram_interpretator.sv (revision 2) +++ trunk/testbench/sdram_interpretator.sv (nonexistent) @@ -1,115 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:54:00 $ -// -// Workfile : sdram_interpretator.sv -// -// Description : testbench only sdram command decoder -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - - -`include "hssdrc_timescale.vh" - -module sdram_interpretator (ba, cs_n, ras_n, cas_n, we_n, a10); - - input wire [1:0] ba; - input wire cs_n; - input wire ras_n; - input wire cas_n; - input wire we_n; - input wire a10; - - enum { - nop, - act0, act1, act2, act3, - rd0, rd1, rd2, rd3, - wr0, wr1, wr2, wr3, - bt, - pre0, pre1, pre2, pre3, - prea, arefr, lmr, inop, unknown - } cmd_e; - - - always_comb begin - logic [3:0] tmp; - - tmp = {cs_n, ras_n, cas_n, we_n}; - - cmd_e = unknown; - - if (cs_n) - cmd_e = inop; - else - case (tmp) - 4'b0111 : cmd_e = nop; - 4'b0011 : begin - case (ba) - 2'd1 : cmd_e = act1; - 2'd2 : cmd_e = act2; - 2'd3 : cmd_e = act3; - default : cmd_e = act0; - endcase - end - 4'b0101 : begin - case (ba) - 2'd1 : cmd_e = rd1; - 2'd2 : cmd_e = rd2; - 2'd3 : cmd_e = rd3; - default : cmd_e = rd0; - endcase - end - 4'b0100 : begin - case (ba) - 2'd1 : cmd_e = wr1; - 2'd2 : cmd_e = wr2; - 2'd3 : cmd_e = wr3; - default : cmd_e = wr0; - endcase - end - 4'b0110 : cmd_e = bt; - 4'b0010 : - if (a10) cmd_e = prea; - else begin - case (ba) - 2'd1 : cmd_e = pre1; - 2'd2 : cmd_e = pre2; - 2'd3 : cmd_e = pre3; - default : cmd_e = pre0; - endcase - end - 4'b0001 : cmd_e = arefr; - 4'b0000 : cmd_e = lmr; - default : cmd_e = unknown; - endcase - end - -endmodule
trunk/testbench/sdram_interpretator.sv Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/testbench/sdram_agent_class.sv =================================================================== --- trunk/testbench/sdram_agent_class.sv (revision 2) +++ trunk/testbench/sdram_agent_class.sv (nonexistent) @@ -1,173 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:54:00 $ -// -// Workfile : sdram_agent_class.sv -// -// Description : agent for connect with hssdrc controller via driver -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - - -`include "tb_define.svh" -`include "sdram_transaction_class.sv" - -class sdram_agent_class; - - // to hssdrc_driver - sdram_tr_mbx in_mbx; - - // input transaction - sdram_tr_mbx write_tr_mbx; - sdram_tr_mbx read_tr_mbx; - - // tb syncronization : transaction done numbers - int write_tr_done_num; - int read_tr_done_num; - - // acknowledge from driver - sdram_tr_ack_mbx done_mbx; - - // - // - // - - function new (sdram_tr_mbx in_mbx, sdram_tr_ack_mbx done_mbx, sdram_tr_mbx write_tr_mbx, read_tr_mbx); - - this.in_mbx = in_mbx; - - this.done_mbx = done_mbx; - - this.write_tr_mbx = write_tr_mbx; - this.read_tr_mbx = read_tr_mbx; - - endfunction - - // - // - // - - task SetTransaction (sdram_transaction_class tr); - tr_type_e_t ret_code; - - in_mbx.put (tr); - - case (tr.tr_type) - cTR_WRITE_LOCKED, cTR_READ_LOCKED, cTR_REFR_LOCKED : done_mbx.get (ret_code); - default : begin end - endcase - - endtask - - // - // - // - - task run_write_read (); - - fork - write_read(); - join_none - - endtask - - // - // - // - - task stop_write_read (); - disable this.run_write_read; - endtask - - // - // - // - - task write_read (); - const int sequental_tr_max_num = 6; - - int tr_num; - - int write_tr_max_num; - int read_tr_max_num; - - int avail_read_tr_num; - - sdram_transaction_class write_tr; - sdram_transaction_class read_tr; - - write_tr_done_num = 0; - read_tr_done_num = 0; - - forever begin - - // - // if there is something to write - // - assert ( std::randomize(write_tr_max_num) with {write_tr_max_num inside {[1:sequental_tr_max_num]};} ) - - for (tr_num = 0; tr_num < write_tr_max_num; tr_num++) begin : write_state - - if (!write_tr_mbx.try_get (write_tr)) - break; - - SetTransaction (write_tr); - - write_tr_done_num++; - end : write_state - - // - // read - // - - assert ( std::randomize(read_tr_max_num) with {read_tr_max_num inside {[1:sequental_tr_max_num]};} ); - - avail_read_tr_num = write_tr_done_num - read_tr_done_num; - - if (read_tr_max_num > avail_read_tr_num) - read_tr_max_num = avail_read_tr_num; - - for (tr_num = 0; tr_num < read_tr_max_num; tr_num++) begin : read_state - - if (!read_tr_mbx.try_get(read_tr)) - break; - - SetTransaction (read_tr); - - read_tr_done_num++; - end : read_state - - #10; - end - - endtask - -endclass
trunk/testbench/sdram_agent_class.sv Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/testbench/message_class.sv =================================================================== --- trunk/testbench/message_class.sv (revision 2) +++ trunk/testbench/message_class.sv (nonexistent) @@ -1,106 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:54:00 $ -// -// Workfile : message_class.sv -// -// Description : simple message service class -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - - -`ifndef __MESSAGE_CLASS__ - - `define __MESSAGE_CLASS__ - - class message_class; - - static int fp; - - static int err_cnt; - - // - // - // - - function new (string file_name = ""); - if (file_name.len() != 0) - fp = $fopen(file_name, "w"); - else - fp = 0; - endfunction - - // - // - // - - function void stop(); - $fclose(fp); - endfunction - - // - // - // - - function void note (string str); - string io_str; - - io_str = $psprintf("**NOTE** at %0t : ", $time); - - io_str = {io_str, str}; - - $display (io_str); - if (fp) - $fdisplay (fp, io_str); - endfunction - - // - // - // - - function void err (string str); - string io_str; - - err_cnt++; - - io_str = $psprintf("**ERROR** at %0t : ", $time); - - io_str = {io_str, str}; - - $display (io_str); - if (fp) - $fdisplay (fp, io_str); - - endfunction - - endclass - -`endif
trunk/testbench/message_class.sv Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/testbench/sdram_tread_class.sv =================================================================== --- trunk/testbench/sdram_tread_class.sv (revision 2) +++ trunk/testbench/sdram_tread_class.sv (nonexistent) @@ -1,105 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:54:00 $ -// -// Workfile : sdram_tread_class.sv -// -// Description : virtual sdram treads using for sdram chip testing -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - - - -`include "tb_define.svh" - -`ifndef __SDRAM_TREAD_CLASS_SV__ - - `define __SDRAM_TREAD_CLASS_SV__ - - class sdram_tread_class; - - sdram_tread_state_s_t active_tread_state [sdram_tread_ptr_t]; - - rand sdram_tread_ptr_t curr_tread_num; // no need to constrant - - sdram_tread_ptr_t disable_tread_num [$]; - - constraint select_tread { !(curr_tread_num inside {disable_tread_num}); } - - // - // - // - - function void Init () ; - int tread_num = 0; - const int shift = clogb2(cBaMaxValue); - sdram_tread_state_s_t tread_state; - - if (active_tread_state.num != 0) - active_tread_state.delete; - - if (disable_tread_num.size != 0) - disable_tread_num = {}; - - for (int rowa = 0; rowa < cRowaMaxValue; rowa++) begin - for (int ba = 0; ba < cBaMaxValue; ba++) begin - - tread_num = (rowa << shift) + ba; - - tread_state = '{ba : ba, rowa : rowa, cola : 0}; - - active_tread_state[tread_num] = tread_state; - - end - end - - endfunction - - // - // - // - - function burst_t GetBurst (input sdram_tread_state_s_t tread_state); - - int max_burst; - - max_burst = cColaMaxValue - tread_state.cola; - - if (max_burst > cBurstMaxValue) max_burst = 16; - - assert (std::randomize(GetBurst) with {GetBurst inside {[1:max_burst]};}) - else $error ("burst generate error : max burst = %0d burst = %0d", max_burst, GetBurst ); - - endfunction - - endclass - -`endif
trunk/testbench/sdram_tread_class.sv Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/testbench/tb_prog.sv =================================================================== --- trunk/testbench/tb_prog.sv (revision 2) +++ trunk/testbench/tb_prog.sv (nonexistent) @@ -1,538 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:54:00 $ -// -// Workfile : tb_prog.sv -// -// Description : testbench program for all cases -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - - -`include "hssdrc_timescale.vh" -`include "hssdrc_define.vh" -`include "hssdrc_timing.vh" -`include "tb_define.svh" - -`include "message_class.sv" - -`include "hssdrc_driver_class.sv" -`include "hssrdc_bandwidth_monitor_class.sv" -`include "hssrdc_scoreboard_class.sv" - -`include "sdram_transaction_class.sv" - -`include "sdram_tread_class.sv" -`include "sdram_agent_class.sv" - -program tb_prog (interface sys_if); - - // agent <-> driver mailbox - sdram_tr_mbx agent2drv_mbx; - sdram_tr_ack_mbx drv2agent_mbx; - - // message service - message_class msg; - - // test program -> agent mailbox - sdram_tr_mbx agent_write_mbx; - sdram_tr_mbx agent_read_mbx; - - // transaction agent class - sdram_agent_class agent; - - // virtual sdram treads - sdram_tread_class tread; - - // driver to uut - hssrdc_driver_class driver; - - // driver callbacks - hssdrc_bandwidth_monitor_class bandwidth_mon; - hssdrc_scoreboard_class scoreboard; - - event scoreboard_event; - event bandwidth_mon_event; - - initial begin - - agent2drv_mbx = new (8); - drv2agent_mbx = new (8); - - agent_write_mbx = new (8); - agent_read_mbx = new (8); - - // init objects - msg = new ("tb_hssdrc.log"); - - driver = new (sys_if, agent2drv_mbx, drv2agent_mbx); - - agent = new (agent2drv_mbx, drv2agent_mbx, agent_write_mbx, agent_read_mbx); - - tread = new ; - - bandwidth_mon = new (sys_if, bandwidth_mon_event); - - scoreboard = new (msg, scoreboard_event); - - driver.run(); - - agent.run_write_read (); - - // calibrate bandwidth monitor - - bandwidth_mon.count_mbps_mfactor(1000); - - // disable debug process inside sdram model - - force tb_top.sdram_chip.Debug = 0; - - wait (sys_if.reset == 1'b0); - - wait (sys_if.cb.ready == 1'b1); - - msg.note ("Program start"); - -`ifdef HSSDRC_NOT_SHARE_ACT_COMMAND - msg.note ("Controller use HSSDRC_NOT_SHARE_ACT_COMMAND macros"); -`endif - -`ifdef HSSDRC_SHARE_ONE_DECODER - msg.note ("Controller use HSSDRC_SHARE_ONE_DECODER macros"); -`endif - -`ifdef HSSDRC_SHARE_NONE_DECODER - msg.note ("Controller use HSSDRC_SHARE_NONE_DECODER macros"); -`endif - - //test(-1,-1); // simple_debug_test - //test(0,0); // linear_test - test(1,1); // random_test - //test(2,2); // bandwidth_measurement - - agent.stop_write_read(); - - driver.stop(); - - msg.stop(); - - $stop; - $finish (2); - - end - - // - // - // - - task test (input int start_task, end_task); - int task_num; - - sdram_transaction_class write_tr; - sdram_transaction_class read_tr; - - sdram_transaction_class rand_tr; - sdram_transaction_class tr; - - int err; - - int tr_burst; - tr_type_e_t tr_type; - int tr_id; - int tr_chid; - int tr_num; - - bit tread_end; - int next_cola; - - sdram_tread_state_s_t tread_state; // selected tread state - int tread_num; // selected tread num - - string log_str; - begin - - for (task_num = start_task; task_num <= end_task; task_num++) - begin - // - // Task -1 : manualy checking write/read transactions - // - if (task_num == -1) begin : simple_debug_test - - msg.note ($psprintf("test %0d : simple debug test", task_num)); - - // - // test for debug only - // - - tr = new (0, cTR_WRITE_LOCKED, .ba(0), .rowa(0), .cola(0), .burst(3)); - tr.GetLinearPacket(); - agent.SetTransaction(tr); - - tr = new (0, cTR_WRITE_LOCKED, .ba(0), .rowa(0), .cola(0), .burst(4)); - tr.GetLinearPacket(); - agent.SetTransaction(tr); - - tr = new (0, cTR_READ_LOCKED, .ba(0), .rowa(0), .cola(0), .burst(4), .chid(1)); - tr.GetLinearPacket(); - agent.SetTransaction(tr); - -// tr = new (0, cTR_READ, .ba(0), .rowa(1), .cola(0), .burst(2)); -// tr.GetLinearPacket(); -// agent.SetTransaction(tr); - - tr = new (0, cTR_REFR_LOCKED, .ba(0), .rowa(0)); - agent.SetTransaction(tr); - - repeat (10) @(sys_if.cb); - end : simple_debug_test - - // - // Task 0 : linear write -> read with linear data (random burst only) - // - - else if (task_num == 0) begin : linear_test - - msg.note ($psprintf("test %0d : linear write -> read with linear data", task_num)); - - // - // test for correctness. set scoreboard callbacks - // - - driver.cbs = {}; - scoreboard.start(); - driver.cbs.push_back(scoreboard); - - driver.random_delay_mode = 1; - // - // transaction generator - // - - tread.Init(); - - msg.note ($psprintf("test %0d start_task with number of treads is %0d", task_num, tread.active_tread_state.num())); - - for (tread_num = 0; tread_num < tread.active_tread_state.num(); tread_num++) begin - - // - // get tread state - // - - tread_state = tread.active_tread_state [tread_num]; - - msg.note ($psprintf("start tread %0d" , tread_num)); - - // - // full tread transaction - // - - tr_num = 0; - - do begin - // - // generate transaction - // - tr_id = tread_num; - tr_type = cTR_WRITE; - tr_burst = tread.GetBurst (tread_state); - tr_chid = tread_state.ba; - - write_tr = new (tr_id, tr_type, tread_state.ba, tread_state.rowa, tread_state.cola, tr_burst, tr_chid); - write_tr.GetLinearPacket(); - - read_tr = new write_tr; - read_tr.tr_type = cTR_READ; - // - // set transaction - // - #10; - agent_write_mbx.put (write_tr); - #10; - agent_read_mbx.put (read_tr); - // - // update tread state - // - tr_num++; - - next_cola = tread_state.cola + tr_burst; - - tread_end = (next_cola >= cColaMaxValue); - - tread_state.cola = next_cola; - - end - while (tread_end != 1); - - msg.note ($psprintf("done tread %0d. number of tread transactions %0d", tread_num, tr_num)); - - end - - // - // wait compare done - // - - do - @(scoreboard_event); - while (agent.read_tr_done_num != scoreboard.checked_tr_num); - - msg.note ($psprintf("test%0d done. Number of errors = %0d", task_num, scoreboard.check_err_num)); - - end : linear_test - - // - // Task 1 : random write -> read with random data, rowa, ba, burst, linear cola - // - - else if (task_num == 1) begin : random_test - - msg.note ($psprintf("test %0d : random write -> read with random data", task_num)); - - // - // test for correctness. set scoreboard callbacks - // - - driver.cbs = {}; - scoreboard.start(); - driver.cbs.push_back(scoreboard); - - driver.random_delay_mode = 1; - - // - // transaction generator - // - - tread.Init(); - - msg.note ($psprintf("test %0d start_task with number of treads is %0d", task_num, tread.active_tread_state.num())); - - tr_num = 0; - - do begin - - // - // select tread - // - - assert (tread.randomize()) else $error ("generate tread selection error"); - - tread_num = tread.curr_tread_num; - - tread_state = tread.active_tread_state [tread_num]; - - // - // generate transaction - // - - tr_burst = tread.GetBurst (tread_state); - tr_type = cTR_WRITE; - tr_id = tread_num; - tr_chid = tread_state.ba; - - write_tr = new (tr_id, tr_type, tread_state.ba, tread_state.rowa, tread_state.cola, tr_burst, tr_chid); - //write_tr.GetLinearPacket(); - write_tr.GetRandomPacket(); - - read_tr = new write_tr; - read_tr.tr_type = cTR_READ; - // - // set transaction - // - #10; - agent_write_mbx.put (write_tr); - #10; - agent_read_mbx.put (read_tr); - // - // update tread state - // - tr_num++; - - next_cola = tread_state.cola + tr_burst; - - tread_end = (next_cola >= cColaMaxValue); - - tread_state.cola = next_cola; - - tread.active_tread_state [tread_num] = tread_state; - // - // if tread end kill it - // - if (tread_end) begin - tread.active_tread_state.delete (tread_num); - tread.disable_tread_num.push_back (tread_num); // random pointer constrain update - msg.note ($psprintf("done tread %0d", tread_num)); - end - - if (tr_num > cTransactionMaxValue) break; - - if (tr_num % cTransactionLogPeriod == 0) - msg.note($psprintf("transaction done %0d", tr_num)); - - end - while (tread.active_tread_state.num() != 0); - - // - // wait compare done - // - - do - @(scoreboard_event); - while (agent.read_tr_done_num != scoreboard.checked_tr_num); - - msg.note ($psprintf("test%0d done. Number of errors = %0d", task_num, scoreboard.check_err_num)); - - end : random_test - - // - // Task 2 : bandwidth measurement - // - - else if (task_num == 2) begin : bandwidth_measurement - - msg.note ($psprintf("test %0d : access bandwidth measurement", task_num)); - - // - // test for perfromance. set bandwidth monitor callbacks, no random delay mode - // - - driver.cbs = {}; - driver.cbs.push_back(bandwidth_mon); - - driver.random_delay_mode = 0; - - // - // generate transactions - // - foreach ( test_mode [t] ) begin : test_mode_cycle - - msg.note ($psprintf("test %0d start %0s test mode", task_num, test_mode_name[test_mode[t]])); - - foreach (burst_mode [b]) begin : burst_cycle - - foreach (address_mode [a] ) begin : address_cycle - - time start_time; - string str; - - tr_num = 0; - start_time = $time; - - // - // init tr.generator - // - - rand_tr = new; - rand_tr.burst_random_mode = burst_mode [b]; - rand_tr.address_random_mode = address_mode [a]; - - bandwidth_mon.start(); - - do begin - - assert ( rand_tr.randomize() ) else begin - $error("test %0d : random transaction generate error", task_num); - $stop; - end - - if ( test_mode[t].write_mode) begin - write_tr = new rand_tr; - write_tr.id = tr_num++; - write_tr.tr_type = cTR_WRITE; - - agent.SetTransaction(write_tr); - end - - if ( test_mode[t].read_mode) begin - read_tr = new rand_tr; - read_tr.id = tr_num++; - read_tr.tr_type = cTR_READ; - - agent.SetTransaction(read_tr); - end - - if (tr_num % cTransactionLogPeriod == 0) - msg.note($psprintf("task %0d transaction done %0d", task_num, tr_num)); - - end - while (($time - start_time) < cPerfomanceInterval); - - // - // syncronize output for measure - // - do - @(bandwidth_mon_event); - while (tr_num != bandwidth_mon.measured_tr_num); - - // - // stop measure - // - bandwidth_mon.stop(); - - // - // logs - // - - str = $psprintf("task %0d done. %0s mode bandwith : %0s and %0s is :\n", task_num, - test_mode_name[test_mode[t]], address_mode_name [address_mode[a]], burst_mode_name [burst_mode[b]]); - - if (test_mode [t].write_mode) - str = {str, $psprintf("\t\twrite bandwidth %0f MBps, %0f %% maximum ram bandwidth\n", - bandwidth_mon.write_bandwidth, bandwidth_mon.write_bandwidth_percent)}; - - if (test_mode [t].read_mode) - str = {str, $psprintf("\t\t read bandwidth %0f MBps, %0f %% maximum ram bandwidth\n", - bandwidth_mon.read_bandwidth, bandwidth_mon.read_bandwidth_percent)}; - - if (test_mode [t].read_mode & test_mode [t].write_mode) - str = {str, $psprintf("\t\tram bandwidth %0f MBps, %0f %% maximum ram bandwidth\n", - bandwidth_mon.bandwidth, bandwidth_mon.bandwidth_percent)}; - - msg.note(str); - - end : address_cycle - - end : burst_cycle - - end : test_mode_cycle - - - end : bandwidth_measurement - - end - - msg.note ("all test done"); - - repeat (100) @(sys_if.cb); - end - - endtask - - - -endprogram
trunk/testbench/tb_prog.sv Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/rtl/hssdrc_top.v =================================================================== --- trunk/rtl/hssdrc_top.v (revision 2) +++ trunk/rtl/hssdrc_top.v (nonexistent) @@ -1,758 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:52:43 $ -// -// Workfile : hssdrc_top.v -// -// Description : top level of memory controller -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -`include "hssdrc_timescale.vh" - -`include "hssdrc_define.vh" - -module hssdrc_top ( - clk , - reset , - sclr , - sys_write , - sys_read , - sys_refr , - sys_rowa , - sys_cola , - sys_ba , - sys_burst , - sys_chid_i , - sys_wdata , - sys_wdatam , - sys_ready , - sys_use_wdata , - sys_vld_rdata , - sys_chid_o , - sys_rdata , - dq , - dqm , - addr , - ba , - cke , - cs_n , - ras_n , - cas_n , - we_n - ); - - input wire clk ; - input wire reset; - input wire sclr ; - - //-------------------------------------------------------------------------------------------------- - // system interface - //-------------------------------------------------------------------------------------------------- - - input wire sys_write ; - input wire sys_read ; - input wire sys_refr ; - input rowa_t sys_rowa ; - input cola_t sys_cola ; - input ba_t sys_ba ; - input burst_t sys_burst ; - input chid_t sys_chid_i ; - input data_t sys_wdata ; - input datam_t sys_wdatam ; - - output logic sys_ready ; - output logic sys_use_wdata ; - output logic sys_vld_rdata ; - output chid_t sys_chid_o ; - output data_t sys_rdata ; - - //-------------------------------------------------------------------------------------------------- - // sdram interface - //-------------------------------------------------------------------------------------------------- - - inout wire [pDataBits-1:0] dq; - output datam_t dqm; - output sdram_addr_t addr; - output ba_t ba; - output logic cke; - output logic cs_n; - output logic ras_n; - output logic cas_n; - output logic we_n; - - //-------------------------------------------------------------------------------------------------- - // internal signals - //-------------------------------------------------------------------------------------------------- - - wire init_done; - wire hssdrc_sclr; - - //-------------------------------------------------------------------------------------------------- - // refr_cnt <-> arbiter_in - //-------------------------------------------------------------------------------------------------- - - wire refr_cnt___ack ; - wire refr_cnt___hi_req ; - wire refr_cnt___low_req ; - - //-------------------------------------------------------------------------------------------------- - // arbiter_in <-> decoder's - //-------------------------------------------------------------------------------------------------- - - wire arbiter_in0___write ; - wire arbiter_in0___read ; - wire arbiter_in0___refr ; - rowa_t arbiter_in0___rowa ; - cola_t arbiter_in0___cola ; - ba_t arbiter_in0___ba ; - burst_t arbiter_in0___burst ; - chid_t arbiter_in0___chid ; - wire arbiter_in0___ready ; - // - wire arbiter_in1___write ; - wire arbiter_in1___read ; - wire arbiter_in1___refr ; - rowa_t arbiter_in1___rowa ; - cola_t arbiter_in1___cola ; - ba_t arbiter_in1___ba ; - burst_t arbiter_in1___burst ; - chid_t arbiter_in1___chid ; - wire arbiter_in1___ready ; - // - wire arbiter_in2___write ; - wire arbiter_in2___read ; - wire arbiter_in2___refr ; - rowa_t arbiter_in2___rowa ; - cola_t arbiter_in2___cola ; - ba_t arbiter_in2___ba ; - burst_t arbiter_in2___burst ; - chid_t arbiter_in2___chid ; - wire arbiter_in2___ready ; - - //-------------------------------------------------------------------------------------------------- - // ba_map <-> decoder's - //-------------------------------------------------------------------------------------------------- - - wire ba_map___update ; - wire ba_map___clear ; - ba_t ba_map___ba ; - rowa_t ba_map___rowa ; - wire ba_map___pre_act_rw ; - wire ba_map___act_rw ; - wire ba_map___rw ; - wire ba_map___all_close ; - - //-------------------------------------------------------------------------------------------------- - // decoder's <-> arbiter_out - //-------------------------------------------------------------------------------------------------- - - wire dec0___pre_all ; - wire dec0___refr ; - wire dec0___pre ; - wire dec0___act ; - wire dec0___read ; - wire dec0___write ; - wire dec0___pre_all_enable ; - wire dec0___refr_enable ; - wire dec0___pre_enable ; - wire dec0___act_enable ; - wire dec0___read_enable ; - wire dec0___write_enable ; - wire dec0___locked ; - wire dec0___last ; - rowa_t dec0___rowa ; - cola_t dec0___cola ; - ba_t dec0___ba ; - chid_t dec0___chid ; - sdram_burst_t dec0___burst ; - // - wire dec1___pre_all ; - wire dec1___refr ; - wire dec1___pre ; - wire dec1___act ; - wire dec1___read ; - wire dec1___write ; - wire dec1___pre_all_enable ; - wire dec1___refr_enable ; - wire dec1___pre_enable ; - wire dec1___act_enable ; - wire dec1___read_enable ; - wire dec1___write_enable ; - wire dec1___locked ; - wire dec1___last ; - rowa_t dec1___rowa ; - cola_t dec1___cola ; - ba_t dec1___ba ; - chid_t dec1___chid ; - sdram_burst_t dec1___burst ; - // - wire dec2___pre_all ; - wire dec2___refr ; - wire dec2___pre ; - wire dec2___act ; - wire dec2___read ; - wire dec2___write ; - wire dec2___pre_all_enable ; - wire dec2___refr_enable ; - wire dec2___pre_enable ; - wire dec2___act_enable ; - wire dec2___read_enable ; - wire dec2___write_enable ; - wire dec2___locked ; - wire dec2___last ; - rowa_t dec2___rowa ; - cola_t dec2___cola ; - ba_t dec2___ba ; - chid_t dec2___chid ; - sdram_burst_t dec2___burst ; - - //-------------------------------------------------------------------------------------------------- - // access_manager -> arbiter_out - //-------------------------------------------------------------------------------------------------- - - wire access_manager___pre_all_enable ; - wire access_manager___refr_enable ; - wire [0:3] access_manager___pre_enable ; - wire [0:3] access_manager___act_enable ; - wire [0:3] access_manager___read_enable ; - wire [0:3] access_manager___write_enable ; - - //-------------------------------------------------------------------------------------------------- - // arbiter_out -> multiplexer/access_manager - //-------------------------------------------------------------------------------------------------- - - wire arbiter_out___pre_all ; - wire arbiter_out___refr ; - wire arbiter_out___pre ; - wire arbiter_out___act ; - wire arbiter_out___read ; - wire arbiter_out___write ; - rowa_t arbiter_out___rowa ; - cola_t arbiter_out___cola ; - ba_t arbiter_out___ba ; - chid_t arbiter_out___chid ; - sdram_burst_t arbiter_out___burst ; - - //-------------------------------------------------------------------------------------------------- - // init_state -> multiplexer - //-------------------------------------------------------------------------------------------------- - - wire init_state___pre_all ; - wire init_state___refr ; - wire init_state___lmr ; - rowa_t init_state___rowa ; - - //-------------------------------------------------------------------------------------------------- - // multiplexer -> sdram_addr_path/sdram_data_path - //-------------------------------------------------------------------------------------------------- - - wire mux___pre_all ; - wire mux___refr ; - wire mux___pre ; - wire mux___act ; - wire mux___read ; - wire mux___write ; - wire mux___lmr ; - rowa_t mux___rowa ; - cola_t mux___cola ; - ba_t mux___ba ; - chid_t mux___chid ; - sdram_burst_t mux___burst ; - - // - // this clear use to disable fsm that must be off when sdram chip is not configured - // - - assign hssdrc_sclr = sclr | ~init_done; - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - hssdrc_refr_counter refr_cnt( - .clk (clk ), - .reset (reset), - .sclr (hssdrc_sclr ), // use internal sclr becouse there is refresh "fsm" - .ack (refr_cnt___ack ), - .hi_req (refr_cnt___hi_req ), - .low_req (refr_cnt___low_req) - ); - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - hssdrc_arbiter_in arbiter_in ( - .clk (clk ), - .reset (reset), - .sclr (hssdrc_sclr ), // use internal sclr becouse there is arbiter fsm - // - .sys_write (sys_write ) , - .sys_read (sys_read ) , - .sys_refr (sys_refr ) , - .sys_rowa (sys_rowa ) , - .sys_cola (sys_cola ) , - .sys_ba (sys_ba ) , - .sys_burst (sys_burst ) , - .sys_chid_i (sys_chid_i) , - .sys_ready (sys_ready ) , - // - .refr_cnt_ack (refr_cnt___ack ), - .refr_cnt_hi_req (refr_cnt___hi_req ), - .refr_cnt_low_req (refr_cnt___low_req), - // - .dec0_write (arbiter_in0___write), - .dec0_read (arbiter_in0___read ), - .dec0_refr (arbiter_in0___refr ), - .dec0_rowa (arbiter_in0___rowa ), - .dec0_cola (arbiter_in0___cola ), - .dec0_ba (arbiter_in0___ba ), - .dec0_burst (arbiter_in0___burst), - .dec0_chid (arbiter_in0___chid ), - .dec0_ready (arbiter_in0___ready), - // - .dec1_write (arbiter_in1___write), - .dec1_read (arbiter_in1___read ), - .dec1_refr (arbiter_in1___refr ), - .dec1_rowa (arbiter_in1___rowa ), - .dec1_cola (arbiter_in1___cola ), - .dec1_ba (arbiter_in1___ba ), - .dec1_burst (arbiter_in1___burst), - .dec1_chid (arbiter_in1___chid ), - .dec1_ready (arbiter_in1___ready), - // - .dec2_write (arbiter_in2___write), - .dec2_read (arbiter_in2___read ), - .dec2_refr (arbiter_in2___refr ), - .dec2_rowa (arbiter_in2___rowa ), - .dec2_cola (arbiter_in2___cola ), - .dec2_ba (arbiter_in2___ba ), - .dec2_burst (arbiter_in2___burst), - .dec2_chid (arbiter_in2___chid ), - .dec2_ready (arbiter_in2___ready) - ); - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - hssdrc_ba_map ba_map ( - .clk (clk ), - .reset (reset), - .sclr (hssdrc_sclr), // use internal sclr becouse there is bank access map - // - .update (ba_map___update), - .clear (ba_map___clear ), - .ba (ba_map___ba ), - .rowa (ba_map___rowa ), - // - .pre_act_rw (ba_map___pre_act_rw), - .act_rw (ba_map___act_rw ), - .rw (ba_map___rw ), - .all_close (ba_map___all_close ) - ); - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - hssdrc_decoder decoder ( - .clk (clk ), - .reset (reset), - .sclr (hssdrc_sclr), // use internal sclr becouse there is decoders fsm - // - .ba_map_update (ba_map___update ), - .ba_map_clear (ba_map___clear ), - .ba_map_ba (ba_map___ba ), - .ba_map_rowa (ba_map___rowa ), - // - .ba_map_pre_act_rw (ba_map___pre_act_rw), - .ba_map_act_rw (ba_map___act_rw ), - .ba_map_rw (ba_map___rw ), - .ba_map_all_close (ba_map___all_close ), - // - .arb0_write (arbiter_in0___write), - .arb0_read (arbiter_in0___read ), - .arb0_refr (arbiter_in0___refr ), - .arb0_rowa (arbiter_in0___rowa ), - .arb0_cola (arbiter_in0___cola ), - .arb0_ba (arbiter_in0___ba ), - .arb0_burst (arbiter_in0___burst), - .arb0_chid (arbiter_in0___chid ), - .arb0_ready (arbiter_in0___ready), - // - .arb1_write (arbiter_in1___write), - .arb1_read (arbiter_in1___read ), - .arb1_refr (arbiter_in1___refr ), - .arb1_rowa (arbiter_in1___rowa ), - .arb1_cola (arbiter_in1___cola ), - .arb1_ba (arbiter_in1___ba ), - .arb1_burst (arbiter_in1___burst), - .arb1_chid (arbiter_in1___chid ), - .arb1_ready (arbiter_in1___ready), - // - .arb2_write (arbiter_in2___write), - .arb2_read (arbiter_in2___read ), - .arb2_refr (arbiter_in2___refr ), - .arb2_rowa (arbiter_in2___rowa ), - .arb2_cola (arbiter_in2___cola ), - .arb2_ba (arbiter_in2___ba ), - .arb2_burst (arbiter_in2___burst), - .arb2_chid (arbiter_in2___chid ), - .arb2_ready (arbiter_in2___ready), - // - .dec0_pre_all (dec0___pre_all ), - .dec0_refr (dec0___refr ), - .dec0_pre (dec0___pre ), - .dec0_act (dec0___act ), - .dec0_read (dec0___read ), - .dec0_write (dec0___write ), - .dec0_pre_all_enable(dec0___pre_all_enable), - .dec0_refr_enable (dec0___refr_enable ), - .dec0_pre_enable (dec0___pre_enable ), - .dec0_act_enable (dec0___act_enable ), - .dec0_read_enable (dec0___read_enable ), - .dec0_write_enable (dec0___write_enable ), - .dec0_locked (dec0___locked ), - .dec0_last (dec0___last ), - .dec0_rowa (dec0___rowa ), - .dec0_cola (dec0___cola ), - .dec0_ba (dec0___ba ), - .dec0_chid (dec0___chid ), - .dec0_burst (dec0___burst ), - // - .dec1_pre_all (dec1___pre_all ), - .dec1_refr (dec1___refr ), - .dec1_pre (dec1___pre ), - .dec1_act (dec1___act ), - .dec1_read (dec1___read ), - .dec1_write (dec1___write ), - .dec1_pre_all_enable(dec1___pre_all_enable), - .dec1_refr_enable (dec1___refr_enable ), - .dec1_pre_enable (dec1___pre_enable ), - .dec1_act_enable (dec1___act_enable ), - .dec1_read_enable (dec1___read_enable ), - .dec1_write_enable (dec1___write_enable ), - .dec1_locked (dec1___locked ), - .dec1_last (dec1___last ), - .dec1_rowa (dec1___rowa ), - .dec1_cola (dec1___cola ), - .dec1_ba (dec1___ba ), - .dec1_chid (dec1___chid ), - .dec1_burst (dec1___burst ), - // - .dec2_pre_all (dec2___pre_all ), - .dec2_refr (dec2___refr ), - .dec2_pre (dec2___pre ), - .dec2_act (dec2___act ), - .dec2_read (dec2___read ), - .dec2_write (dec2___write ), - .dec2_pre_all_enable(dec2___pre_all_enable), - .dec2_refr_enable (dec2___refr_enable ), - .dec2_pre_enable (dec2___pre_enable ), - .dec2_act_enable (dec2___act_enable ), - .dec2_read_enable (dec2___read_enable ), - .dec2_write_enable (dec2___write_enable ), - .dec2_locked (dec2___locked ), - .dec2_last (dec2___last ), - .dec2_rowa (dec2___rowa ), - .dec2_cola (dec2___cola ), - .dec2_ba (dec2___ba ), - .dec2_chid (dec2___chid ), - .dec2_burst (dec2___burst ) - ); - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - hssdrc_arbiter_out arbiter_out( - .clk (clk), - .reset (reset), - .sclr (hssdrc_sclr), // use internal sclr becouse there is arbiter fsm - // - .dec0_pre_all (dec0___pre_all ), - .dec0_refr (dec0___refr ), - .dec0_pre (dec0___pre ), - .dec0_act (dec0___act ), - .dec0_read (dec0___read ), - .dec0_write (dec0___write ), - .dec0_pre_all_enable(dec0___pre_all_enable), - .dec0_refr_enable (dec0___refr_enable ), - .dec0_pre_enable (dec0___pre_enable ), - .dec0_act_enable (dec0___act_enable ), - .dec0_read_enable (dec0___read_enable ), - .dec0_write_enable (dec0___write_enable ), - .dec0_locked (dec0___locked ), - .dec0_last (dec0___last ), - .dec0_rowa (dec0___rowa ), - .dec0_cola (dec0___cola ), - .dec0_ba (dec0___ba ), - .dec0_chid (dec0___chid ), - .dec0_burst (dec0___burst ), - // - .dec1_pre_all (dec1___pre_all ), - .dec1_refr (dec1___refr ), - .dec1_pre (dec1___pre ), - .dec1_act (dec1___act ), - .dec1_read (dec1___read ), - .dec1_write (dec1___write ), - .dec1_pre_all_enable(dec1___pre_all_enable), - .dec1_refr_enable (dec1___refr_enable ), - .dec1_pre_enable (dec1___pre_enable ), - .dec1_act_enable (dec1___act_enable ), - .dec1_read_enable (dec1___read_enable ), - .dec1_write_enable (dec1___write_enable ), - .dec1_locked (dec1___locked ), - .dec1_last (dec1___last ), - .dec1_rowa (dec1___rowa ), - .dec1_cola (dec1___cola ), - .dec1_ba (dec1___ba ), - .dec1_chid (dec1___chid ), - .dec1_burst (dec1___burst ), - // - .dec2_pre_all (dec2___pre_all ), - .dec2_refr (dec2___refr ), - .dec2_pre (dec2___pre ), - .dec2_act (dec2___act ), - .dec2_read (dec2___read ), - .dec2_write (dec2___write ), - .dec2_pre_all_enable(dec2___pre_all_enable), - .dec2_refr_enable (dec2___refr_enable ), - .dec2_pre_enable (dec2___pre_enable ), - .dec2_act_enable (dec2___act_enable ), - .dec2_read_enable (dec2___read_enable ), - .dec2_write_enable (dec2___write_enable ), - .dec2_locked (dec2___locked ), - .dec2_last (dec2___last ), - .dec2_rowa (dec2___rowa ), - .dec2_cola (dec2___cola ), - .dec2_ba (dec2___ba ), - .dec2_chid (dec2___chid ), - .dec2_burst (dec2___burst ), - // - .am_pre_all_enable (access_manager___pre_all_enable), - .am_refr_enable (access_manager___refr_enable ), - .am_pre_enable (access_manager___pre_enable ), - .am_act_enable (access_manager___act_enable ), - .am_read_enable (access_manager___read_enable ), - .am_write_enable (access_manager___write_enable ), - // - .arb_pre_all (arbiter_out___pre_all), - .arb_refr (arbiter_out___refr ), - .arb_pre (arbiter_out___pre ), - .arb_act (arbiter_out___act ), - .arb_read (arbiter_out___read ), - .arb_write (arbiter_out___write ), - .arb_rowa (arbiter_out___rowa ), - .arb_cola (arbiter_out___cola ), - .arb_ba (arbiter_out___ba ), - .arb_chid (arbiter_out___chid ), - .arb_burst (arbiter_out___burst ) - ); - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - hssdrc_access_manager access_manager ( - .clk (clk ), - .reset (reset), - .sclr (hssdrc_sclr), // use internal sclr becouse there is access "fsm's" - // - .arb_pre_all (arbiter_out___pre_all), - .arb_refr (arbiter_out___refr ), - .arb_pre (arbiter_out___pre ), - .arb_act (arbiter_out___act ), - .arb_read (arbiter_out___read ), - .arb_write (arbiter_out___write ), - .arb_ba (arbiter_out___ba ), - .arb_burst (arbiter_out___burst ), - // - .am_pre_all_enable (access_manager___pre_all_enable), - .am_refr_enable (access_manager___refr_enable ), - .am_pre_enable (access_manager___pre_enable ), - .am_act_enable (access_manager___act_enable ), - .am_read_enable (access_manager___read_enable ), - .am_write_enable (access_manager___write_enable ) - ); - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - hssdrc_init_state init_state( - .clk (clk ), - .reset (reset), - .sclr (sclr ), // use external sclr becouse this is initial start fsm - .init_done (init_done), - .pre_all (init_state___pre_all), - .refr (init_state___refr ), - .lmr (init_state___lmr ), - .rowa (init_state___rowa ) - ); - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - hssdrc_mux mux ( - .init_done (init_done), - // - .init_state_pre_all (init_state___pre_all), - .init_state_refr (init_state___refr ), - .init_state_lmr (init_state___lmr ), - .init_state_rowa (init_state___rowa ), - // - .arb_pre_all (arbiter_out___pre_all), - .arb_refr (arbiter_out___refr ), - .arb_pre (arbiter_out___pre ), - .arb_act (arbiter_out___act ), - .arb_read (arbiter_out___read ), - .arb_write (arbiter_out___write ), - .arb_rowa (arbiter_out___rowa ), - .arb_cola (arbiter_out___cola ), - .arb_ba (arbiter_out___ba ), - .arb_chid (arbiter_out___chid ), - .arb_burst (arbiter_out___burst ), - // - .mux_pre_all (mux___pre_all), - .mux_refr (mux___refr ), - .mux_pre (mux___pre ), - .mux_act (mux___act ), - .mux_read (mux___read ), - .mux_write (mux___write ), - .mux_lmr (mux___lmr ), - .mux_rowa (mux___rowa ), - .mux_cola (mux___cola ), - .mux_ba (mux___ba ), - .mux_chid (mux___chid ), - .mux_burst (mux___burst ) - ); - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - `ifndef HSSDRC_DQ_PIPELINE - - hssdrc_data_path data_path ( - .clk (clk ), - .reset (reset), - .sclr (sclr ), // use external sclr becouse there is no any fsm - // - .sys_wdata (sys_wdata ), - .sys_wdatam (sys_wdatam ), - .sys_use_wdata (sys_use_wdata), - .sys_vld_rdata (sys_vld_rdata), - .sys_chid_o (sys_chid_o ), - .sys_rdata (sys_rdata ), - // - .arb_read (mux___read ), - .arb_write (mux___write ), - .arb_chid (mux___chid ), - .arb_burst (mux___burst ), - // - .dq (dq ), - .dqm (dqm ) - ); - - `else - - hssdrc_data_path_p1 data_path_p1 ( - .clk (clk ), - .reset (reset), - .sclr (sclr ), // use external sclr becouse there is no any fsm - // - .sys_wdata (sys_wdata ), - .sys_wdatam (sys_wdatam ), - .sys_use_wdata (sys_use_wdata), - .sys_vld_rdata (sys_vld_rdata), - .sys_chid_o (sys_chid_o ), - .sys_rdata (sys_rdata ), - // - .arb_read (mux___read ), - .arb_write (mux___write ), - .arb_chid (mux___chid ), - .arb_burst (mux___burst ), - // - .dq (dq ), - .dqm (dqm ) - ); - - `endif - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - `ifndef HSSDRC_DQ_PIPELINE - - hssdrc_addr_path addr_path( - .clk (clk ), - .reset (reset), - .sclr (sclr ), // use external sclr becouse there is no any fsm - // - .arb_pre_all (mux___pre_all), - .arb_refr (mux___refr ), - .arb_pre (mux___pre ), - .arb_act (mux___act ), - .arb_read (mux___read ), - .arb_write (mux___write ), - .arb_lmr (mux___lmr ), - .arb_rowa (mux___rowa ), - .arb_cola (mux___cola ), - .arb_ba (mux___ba ), - // - .addr (addr ), - .ba (ba ), - .cke (cke ), - .cs_n (cs_n ), - .ras_n (ras_n), - .cas_n (cas_n), - .we_n (we_n ) - ); - - `else - - hssdrc_addr_path_p1 addr_path_p1( - .clk (clk ), - .reset (reset), - .sclr (sclr ), // use external sclr becouse there is no any fsm - // - .arb_pre_all (mux___pre_all), - .arb_refr (mux___refr ), - .arb_pre (mux___pre ), - .arb_act (mux___act ), - .arb_read (mux___read ), - .arb_write (mux___write ), - .arb_lmr (mux___lmr ), - .arb_rowa (mux___rowa ), - .arb_cola (mux___cola ), - .arb_ba (mux___ba ), - // - .addr (addr ), - .ba (ba ), - .cke (cke ), - .cs_n (cs_n ), - .ras_n (ras_n), - .cas_n (cas_n), - .we_n (we_n ) - ); - - `endif - -endmodule - -
trunk/rtl/hssdrc_top.v Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/rtl/hssdrc_init_state.v =================================================================== --- trunk/rtl/hssdrc_init_state.v (revision 2) +++ trunk/rtl/hssdrc_init_state.v (nonexistent) @@ -1,154 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:52:43 $ -// -// Workfile : hssdrc_init_state.v -// -// Description : sdram chip initialization unit -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -`include "hssdrc_timescale.vh" - -`include "hssdrc_timing.vh" -`include "hssdrc_define.vh" - -module hssdrc_init_state ( - clk , - reset , - sclr , - init_done , - pre_all , - refr , - lmr , - rowa - ); - - input wire clk ; - input wire reset; - input wire sclr ; - - output logic init_done; - output logic pre_all ; - output logic refr ; - output logic lmr ; - output rowa_t rowa ; - - assign rowa = cInitLmrValue; - - //--------------------------------------------------------------------------------------------------- - // counter based FSM - // fsm has 1 counter divided by 2 part : - // cnt_high - decode for wait init interval - // cnt_low - execute command sequence when wait done. - // true init time is ~= (1.1 - 1.2) pInit_time for less logic resource using - //--------------------------------------------------------------------------------------------------- - - localparam int unsigned cInitPre = 1; - localparam int unsigned cInitRefr0 = cInitPre + cTrp; - localparam int unsigned cInitRefr1 = cInitRefr0 + cTrfc; - localparam int unsigned cInitLmr = cInitRefr1 + cTrfc; - localparam int unsigned cInitDone = cInitLmr + cTmrd + 1; - - // - // counter parameters - // - - localparam int unsigned cInitCntLowWidth = clogb2(cInitDone); - localparam int unsigned cInitCntHighMax = (cInitTime >> cInitCntLowWidth) + 1; - localparam int unsigned cInitCntWidth = clogb2(cInitCntHighMax) + cInitCntLowWidth; - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - logic [cInitCntWidth-1 : 0] cnt; - logic [cInitCntLowWidth-1 : 0] cnt_low; - logic [cInitCntWidth-1 : cInitCntLowWidth] cnt_high; - - logic cnt_high_is_max; - - assign cnt_low = cnt [cInitCntLowWidth-1 : 0]; - assign cnt_high = cnt [cInitCntWidth-1 : cInitCntLowWidth]; - - - always_ff @(posedge clk or posedge reset) begin : cnt_fsm - if (reset) - cnt <= '0; - else if (sclr) - cnt <= '0; - else if (~init_done) - cnt <= cnt + 1'b1; - end - - - always_ff @(posedge clk or posedge reset) begin : cnt_fsm_comparator - if (reset) - cnt_high_is_max <= 1'b0; - else if (sclr) - cnt_high_is_max <= 1'b0; - else - cnt_high_is_max <= (cnt_high == cInitCntHighMax); - end - - - always_ff @(posedge clk or posedge reset) begin : cnt_fsm_decode - if (reset) begin - init_done <= 1'b0; - pre_all <= 1'b0; - refr <= 1'b0; - lmr <= 1'b0; - end - else if (sclr) begin - init_done <= 1'b0; - pre_all <= 1'b0; - refr <= 1'b0; - lmr <= 1'b0; - end - else begin - - pre_all <= 1'b0; - refr <= 1'b0; - lmr <= 1'b0; - - unique case (cnt_low) - cInitPre : pre_all <= cnt_high_is_max; - cInitRefr0 : refr <= cnt_high_is_max; - cInitRefr1 : refr <= cnt_high_is_max; - cInitLmr : lmr <= cnt_high_is_max; - cInitDone : init_done <= cnt_high_is_max; - default : begin end - endcase - - end - end - -endmodule
trunk/rtl/hssdrc_init_state.v Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/rtl/hssdrc_data_path.v =================================================================== --- trunk/rtl/hssdrc_data_path.v (revision 2) +++ trunk/rtl/hssdrc_data_path.v (nonexistent) @@ -1,405 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:52:43 $ -// -// Workfile : hssdrc_data_path.v -// -// Description : sdram data (data & mask) path unit -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -`include "hssdrc_timescale.vh" - -`include "hssdrc_timing.vh" -`include "hssdrc_define.vh" - -module hssdrc_data_path ( - clk , - reset , - sclr , - // - sys_wdata , - sys_wdatam , - sys_use_wdata , - sys_vld_rdata , - sys_chid_o , - sys_rdata , - // - arb_read , - arb_write , - arb_chid , - arb_burst , - // - dq , - dqm - ); - - input wire clk; - input wire reset; - input wire sclr; - - //-------------------------------------------------------------------------------------------------- - // system data interface - //-------------------------------------------------------------------------------------------------- - - input data_t sys_wdata ; - input datam_t sys_wdatam ; - output logic sys_use_wdata ; - output logic sys_vld_rdata ; - output chid_t sys_chid_o ; - output data_t sys_rdata ; - - //-------------------------------------------------------------------------------------------------- - // interface from arbiter throw multiplexer - //-------------------------------------------------------------------------------------------------- - - input wire arb_read ; - input wire arb_write ; - input chid_t arb_chid ; - input sdram_burst_t arb_burst ; - - //-------------------------------------------------------------------------------------------------- - // interface sdram chip - //-------------------------------------------------------------------------------------------------- - - inout wire [pDataBits-1 :0] dq; - output logic [pDatamBits-1 :0] dqm; - - //-------------------------------------------------------------------------------------------------- - // Mask paramters count via pBL, pCL parameters only for clarify. - // unit has been designed to use fixed lengh mask patterns - //-------------------------------------------------------------------------------------------------- - localparam cWDataMask = cSdramBL - 1; // - 1 cycle for write command itself - - localparam cRDataMask = cSdramBL - 1 + pCL - 2; // - 1 cycle for read command itself, - // - 2 cycle for read dqm latency - - localparam cDataMask = max(cWDataMask, cRDataMask); - - localparam cReadAllign = pCL + 1; // + 1 is capture register cycle - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - logic [3:0] use_wdata_srl; - wire use_wdata; - wire use_wdatam; - - logic [cDataMask-1 : 0] datam_srl; - logic datam; - - - - logic [3:0] vld_rdata_srl; - logic vld_rdata; - logic vld_rdata_allign_srl [cReadAllign-1 : 0]; - - chid_t chid_srl [3:0]; - chid_t chid; - chid_t chid_allign_srl [cReadAllign-1 : 0]; - - //-------------------------------------------------------------------------------------------------- - // use write data & mask - //-------------------------------------------------------------------------------------------------- - - always_ff @(posedge clk or posedge reset) begin : use_wdata_generate - if (reset) - use_wdata_srl <= 4'b0000; - else if (sclr) - use_wdata_srl <= 4'b0000; - else if (arb_write) - unique case (arb_burst) - 2'h0 : use_wdata_srl <= 4'b1000; - 2'h1 : use_wdata_srl <= 4'b1100; - 2'h2 : use_wdata_srl <= 4'b1110; - 2'h3 : use_wdata_srl <= 4'b1111; - endcase - else - use_wdata_srl <= (use_wdata_srl << 1); - end - - assign use_wdata = use_wdata_srl[3]; - assign use_wdatam = use_wdata_srl[3]; - - //-------------------------------------------------------------------------------------------------- - // read/write data mask for command terminate - //-------------------------------------------------------------------------------------------------- - - always_ff @(posedge clk or posedge reset) begin : data_burst_mask_generate - if (reset) - datam_srl <= '0; - else if (sclr) - datam_srl <= '0; - else begin - if (arb_write) - datam_srl <= WriteMaskBits(arb_burst); - else if (arb_read) - datam_srl <= ReadMaskBits(arb_burst); - else - datam_srl <= (datam_srl << 1); - end - end - - always_ff @(posedge clk or posedge reset) begin : data_mask_generate - if (reset) - datam <= 1'b0; - else if (sclr) - datam <= 1'b0; - else begin - if (arb_write) - datam <= 1'b0; - else if (arb_read) - datam <= FirstReadMaskBit(arb_burst); - else - datam <= datam_srl [cDataMask-1]; - end - end - - // - // dqm - // - - assign dqm = use_wdatam ? sys_wdatam : {pDatamBits{datam}}; - - //-------------------------------------------------------------------------------------------------- - // write data request - //-------------------------------------------------------------------------------------------------- - -`ifndef HSSDRC_COMBINATORY_USE_WDATA - - assign sys_use_wdata = use_wdata; - -`else - - logic [2:0] use_wdata_srl_small; - - always_ff @(posedge clk or posedge reset) begin : use_wdata_small_generate - if (reset) - use_wdata_srl_small <= 3'b000; - else if (sclr) - use_wdata_srl_small <= 3'b000; - else if (arb_write) - unique case (arb_burst) - 2'h0 : use_wdata_srl_small <= 3'b000; - 2'h1 : use_wdata_srl_small <= 3'b100; - 2'h2 : use_wdata_srl_small <= 3'b110; - 2'h3 : use_wdata_srl_small <= 3'b111; - endcase - else - use_wdata_srl_small <= (use_wdata_srl_small << 1); - end - - assign sys_use_wdata = arb_write | use_wdata_srl_small[2]; - -`endif - // - // dq - // - - assign dq = use_wdata ? sys_wdata : {pDataBits{1'bz}}; - - //-------------------------------------------------------------------------------------------------- - // read data - //-------------------------------------------------------------------------------------------------- - - always_ff @(posedge clk or posedge reset) begin : vld_rdata_generate - if (reset) - vld_rdata_srl <= 4'b0000; - else if (sclr) - vld_rdata_srl <= 4'b0000; - else if (arb_read) - unique case (arb_burst) - 2'h0 : vld_rdata_srl <= 4'b1000; - 2'h1 : vld_rdata_srl <= 4'b1100; - 2'h2 : vld_rdata_srl <= 4'b1110; - 2'h3 : vld_rdata_srl <= 4'b1111; - endcase - else - vld_rdata_srl <= (vld_rdata_srl << 1); - end - - assign vld_rdata = vld_rdata_srl [3]; - - // - // - // - - always_ff @(posedge clk) begin : chid_rdata_generate - int i; - - if (arb_read) begin - for (i = 0; i < 4; i++) - chid_srl[i] <= arb_chid; // load all with chid - end - else begin - for (i = 1; i < 4; i++) - chid_srl[i] <= chid_srl[i-1]; // shift left - end - end - - assign chid = chid_srl [3]; - - // - // - // - - always_ff @(posedge clk or posedge reset) begin : vld_rdata_allign_generate - int i; - - if (reset) begin - for (i = 0; i < cReadAllign; i++) - vld_rdata_allign_srl[i] <= 1'b0; - end - else if (sclr) begin - for (i = 0; i < cReadAllign; i++) - vld_rdata_allign_srl[i] <= 1'b0; - end - else begin - vld_rdata_allign_srl[0] <= vld_rdata; // shift left - - for (i = 1; i < cReadAllign; i++) - vld_rdata_allign_srl[i] <= vld_rdata_allign_srl [i-1]; - end - end - - - assign sys_vld_rdata = vld_rdata_allign_srl [cReadAllign-1]; - - // - // - // - - always_ff @(posedge clk) begin : chid_allign_generate - int i; - - chid_allign_srl[0] <= chid; // shift left - - for (i = 1; i < cReadAllign; i++) - chid_allign_srl[i] <= chid_allign_srl[i-1]; - end - - - assign sys_chid_o = chid_allign_srl [cReadAllign-1]; - - // - // - // - - always_ff @(posedge clk) begin : rdata_reclock - sys_rdata <= dq; - end - - //-------------------------------------------------------------------------------------------------- - // function to count write bit mask pattern for different burst value and - // for different Cas Latency paramter value - // full burst == 2'h3 no need to be masked - //-------------------------------------------------------------------------------------------------- - - function automatic bit [cDataMask-1:0] WriteMaskBits (input bit [1:0] burst); - if (pCL == 3) begin - WriteMaskBits = 4'b0000; - case (burst) - 2'h0 : WriteMaskBits = 4'b1110; - 2'h1 : WriteMaskBits = 4'b0110; - 2'h2 : WriteMaskBits = 4'b0010; - endcase - end - else if (pCL == 2) begin - WriteMaskBits = 3'b000; - case (burst) - 2'h0 : WriteMaskBits = 3'b111; - 2'h1 : WriteMaskBits = 3'b011; - 2'h2 : WriteMaskBits = 3'b001; - endcase - end - else if (pCL == 1) begin - WriteMaskBits = 3'b000; - case (burst) - 2'h0 : WriteMaskBits = 3'b111; - 2'h1 : WriteMaskBits = 3'b011; - 2'h2 : WriteMaskBits = 3'b001; - endcase - end - else begin - WriteMaskBits = '0; - end - endfunction - - //-------------------------------------------------------------------------------------------------- - // function to count first read bit mask pattern for different burst value and - // for different Cas Latency paramter value - //-------------------------------------------------------------------------------------------------- - - function automatic bit FirstReadMaskBit (input bit [1:0] burst); - if ((pCL == 1) && (burst == 0)) - FirstReadMaskBit = 1'b1; - else - FirstReadMaskBit = 1'b0; - endfunction - - //-------------------------------------------------------------------------------------------------- - // function to count read bit mask pattern for different burst value and - // for different Cas Latency paramter value - // full burst == 2'h3 no need to be masked - //-------------------------------------------------------------------------------------------------- - - function automatic bit [cDataMask-1:0] ReadMaskBits (input bit [1:0] burst); - if (pCL == 3) begin - ReadMaskBits = 4'b0000; - case (burst) - 2'h0 : ReadMaskBits = 4'b0111; - 2'h1 : ReadMaskBits = 4'b0011; - 2'h2 : ReadMaskBits = 4'b0001; - endcase - end - else if (pCL == 2) begin - ReadMaskBits = 3'b000; - case (burst) - 2'h0 : ReadMaskBits = 3'b111; - 2'h1 : ReadMaskBits = 3'b011; - 2'h2 : ReadMaskBits = 3'b001; - endcase - end - else if (pCL == 1) begin - ReadMaskBits = 3'b000; - case (burst) - 2'h0 : ReadMaskBits = 3'b110; - 2'h1 : ReadMaskBits = 3'b110; - 2'h2 : ReadMaskBits = 3'b010; - endcase - end - else begin - ReadMaskBits = '0; - end - endfunction - -endmodule
trunk/rtl/hssdrc_data_path.v Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/rtl/hssdrc_decoder_state.v =================================================================== --- trunk/rtl/hssdrc_decoder_state.v (revision 2) +++ trunk/rtl/hssdrc_decoder_state.v (nonexistent) @@ -1,534 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:52:43 $ -// -// Workfile : hssdrc_decoder_state.v -// -// Description : sdram command sequence decoder -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -`include "hssdrc_timescale.vh" - -`include "hssdrc_timing.vh" -`include "hssdrc_define.vh" - - -module hssdrc_decoder_state ( - clk , - reset , - sclr , - // - ba_map_update , - ba_map_clear , - ba_map_pre_act_rw , - ba_map_act_rw , - ba_map_rw , - ba_map_all_close , - // - arb_write , - arb_read , - arb_refr , - arb_rowa , - arb_cola , - arb_ba , - arb_burst , - arb_chid , - arb_ready , - // - dec_pre_all , - dec_refr , - dec_pre , - dec_act , - dec_read , - dec_write , - // - dec_pre_all_enable, - dec_refr_enable , - dec_pre_enable , - dec_act_enable , - dec_read_enable , - dec_write_enable , - // - dec_locked , - dec_last , - // - dec_rowa , - dec_cola , - dec_ba , - dec_chid , - // - dec_burst - ); - - input wire clk ; - input wire reset; - input wire sclr ; - - //-------------------------------------------------------------------------------------------------- - // bank map interface - //-------------------------------------------------------------------------------------------------- - - output logic ba_map_update ; - output logic ba_map_clear ; - input wire ba_map_pre_act_rw ; - input wire ba_map_act_rw ; - input wire ba_map_rw ; - input wire ba_map_all_close ; - - //-------------------------------------------------------------------------------------------------- - // interface from input arbiter - //-------------------------------------------------------------------------------------------------- - - input wire arb_write ; - input wire arb_read ; - input wire arb_refr ; - input rowa_t arb_rowa ; - input cola_t arb_cola ; - input ba_t arb_ba ; - input burst_t arb_burst ; - input chid_t arb_chid ; - output logic arb_ready ; - - //-------------------------------------------------------------------------------------------------- - // inteface to output arbiter - //-------------------------------------------------------------------------------------------------- - - // logical commands - output logic dec_pre_all ; - output logic dec_refr ; - output logic dec_pre ; - output logic dec_act ; - output logic dec_read ; - output logic dec_write ; - // logical commands en - input wire dec_pre_all_enable ; - input wire dec_refr_enable ; - input wire dec_pre_enable ; - input wire dec_act_enable ; - input wire dec_read_enable ; - input wire dec_write_enable ; - // addititional signal - output logic dec_locked ; - output logic dec_last ; - // control path - output rowa_t dec_rowa ; - output cola_t dec_cola ; - output ba_t dec_ba ; - output chid_t dec_chid ; - // - output sdram_burst_t dec_burst ; - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - localparam int cTrp_m1 = cTrp - 1; - localparam int cTrcd_m1 = cTrcd - 1; - - typedef enum { - STATE_RESET_BIT , // need for create simple true ready condition - STATE_IDLE_BIT , - STATE_DECODE_BIT , - STATE_PRE_BIT , - STATE_TRP_BIT , - STATE_ACT_BIT , - STATE_TRCD_BIT , - STATE_RW_BIT , - STATE_ADDR_INC_BIT, - STATE_PRE_ALL_BIT , - STATE_REFR_BIT - } state_bits_e; - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - enum bit [10:0] { - STATE_RESET = (11'h1 << STATE_RESET_BIT) , - STATE_IDLE = (11'h1 << STATE_IDLE_BIT) , - STATE_DECODE = (11'h1 << STATE_DECODE_BIT) , - STATE_PRE = (11'h1 << STATE_PRE_BIT) , - STATE_TRP = (11'h1 << STATE_TRP_BIT) , - STATE_ACT = (11'h1 << STATE_ACT_BIT) , - STATE_TRCD = (11'h1 << STATE_TRCD_BIT) , - STATE_RW = (11'h1 << STATE_RW_BIT) , - STATE_ADDR_INC = (11'h1 << STATE_ADDR_INC_BIT) , - STATE_PRE_ALL = (11'h1 << STATE_PRE_ALL_BIT) , - STATE_REFR = (11'h1 << STATE_REFR_BIT) - } state, next_state; - - logic refr_mode ; - logic write_mode ; - - logic burst_done ; - logic early_burst_done; - - cola_t cola_latched ; - rowa_t rowa_latched ; - ba_t ba_latched ; - chid_t chid_latched ; - - logic [3:0] burst_latched ; - logic [3:0] burst_shift_cnt ; - - logic [3:0] available_burst ; - - logic [3:0] remained_burst ; - logic [1:0] remained_burst_high ; - logic [1:0] remained_burst_low ; - logic [1:0] remained_burst_low_latched; - - logic [3:0] last_used_burst; - - wire trp_cnt_done; - wire trcd_cnt_done; - - //-------------------------------------------------------------------------------------------------- - // use shift register instead of counter for trp time count - //-------------------------------------------------------------------------------------------------- - - generate - if (cTrp_m1 <= 1) begin : no_trp_cnt_generate - - assign trp_cnt_done = 1'b1; - - end - else begin : trp_cnt_generate - - logic [cTrp_m1-2:0] trp_cnt; - - always_ff @(posedge clk) begin - if (state [STATE_TRP_BIT]) - trp_cnt <= (trp_cnt << 1) | 1'b1; - else - trp_cnt <= '0; - end - - assign trp_cnt_done = trp_cnt [cTrp_m1-2]; - - end - endgenerate - - //-------------------------------------------------------------------------------------------------- - // use shift register instead of counter for trcd time count - //-------------------------------------------------------------------------------------------------- - - generate - if (cTrcd_m1 <= 1) begin : no_trcd_cnt_generate - - assign trcd_cnt_done = 1'b1; - - end - else begin : trcd_cnt_generate - - logic [cTrcd_m1-2:0] trcd_cnt; - - always_ff @(posedge clk) begin - if (state [STATE_TRCD_BIT]) - trcd_cnt <= (trcd_cnt << 1) | 1'b1; - else - trcd_cnt <= '0; - end - - assign trcd_cnt_done = trcd_cnt [cTrcd_m1-2]; - - end - endgenerate - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - always_comb begin : fsm_jump_decode - - next_state = STATE_RESET; - - unique case (1'b1) - - state [STATE_RESET_BIT] : begin - next_state = STATE_IDLE; - end - - state [STATE_IDLE_BIT] : begin - if (arb_write | arb_read | arb_refr) - next_state = STATE_DECODE; - else - next_state = STATE_IDLE; - end - // - // decode branch - // - state [STATE_DECODE_BIT] : begin - if (refr_mode) begin : shorten_refresh_decode - - if (ba_map_all_close) - next_state = STATE_REFR; - else - next_state = STATE_PRE_ALL; - - end - else begin : mode_of_rw_decode - - if (ba_map_pre_act_rw) - next_state = STATE_PRE; - else if (ba_map_rw) - next_state = STATE_RW; - else // if (ba_map_act_rw) - next_state = STATE_ACT; - - end - end - // - // pre branch - // - state [STATE_PRE_BIT] : begin - if (dec_pre_enable) - - if (cTrp_m1 == 0) - next_state = STATE_ACT; - else - next_state = STATE_TRP; - - else - next_state = STATE_PRE; - end - - state [STATE_TRP_BIT] : begin - if (trp_cnt_done) - next_state = STATE_ACT; - else - next_state = STATE_TRP; - end - // - // act branch - // - state [STATE_ACT_BIT] : begin - if (dec_act_enable) - - if (cTrcd_m1 == 0) - next_state = STATE_RW; - else - next_state = STATE_TRCD; - - else - next_state = STATE_ACT; - end - - state [STATE_TRCD_BIT] : begin - if (trcd_cnt_done) - next_state = STATE_RW; - else - next_state = STATE_TRCD; - end - // - // data branch - // - state [STATE_RW_BIT] : begin - if ((dec_write_enable & write_mode) | (dec_read_enable & ~write_mode)) begin : burst_done_decode - - if (burst_done) - next_state = STATE_IDLE; - else - next_state = STATE_ADDR_INC; - - end - else begin - next_state = STATE_RW; - end - end - - state [STATE_ADDR_INC_BIT] : begin - next_state = STATE_RW; - end - // - // refresh breanch - // - state [STATE_PRE_ALL_BIT] : begin - if (dec_pre_all_enable) - next_state = STATE_REFR; - else - next_state = STATE_PRE_ALL; - end - - state [STATE_REFR_BIT] : begin - if (dec_refr_enable) - next_state = STATE_IDLE; - else - next_state = STATE_REFR; - end - - endcase - end - - //--------------------------------------------------------------------------------------------------- - // - //--------------------------------------------------------------------------------------------------- - - always_ff @(posedge clk or posedge reset) begin : fsm_register_process - if (reset) state <= STATE_RESET; - else if (sclr) state <= STATE_RESET; - else state <= next_state; - end - - //--------------------------------------------------------------------------------------------------- - // - //--------------------------------------------------------------------------------------------------- - - assign arb_ready = state[STATE_IDLE_BIT]; - - assign dec_pre_all = state[STATE_PRE_ALL_BIT]; - assign dec_refr = state[STATE_REFR_BIT]; - assign dec_pre = state[STATE_PRE_BIT]; - assign dec_act = state[STATE_ACT_BIT]; - assign dec_read = state[STATE_RW_BIT] & ~write_mode; - assign dec_write = state[STATE_RW_BIT] & write_mode; - assign dec_last = state[STATE_RW_BIT] & burst_done ; - - // - // instead of decode state_refr_bit & state_pre_all_bit we can use refresh mode register - // - - assign dec_locked = refr_mode; - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - assign ba_map_update = state[STATE_DECODE_BIT] & ~refr_mode; - assign ba_map_clear = state[STATE_DECODE_BIT] & refr_mode; - - always_ff @(posedge clk) begin : mode_logic - if (state [STATE_IDLE_BIT]) begin - refr_mode <= arb_refr; - write_mode <= arb_write; - end - end - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - always_ff @(posedge clk) begin : addr_chid_logic - - if (state[STATE_IDLE_BIT]) begin - rowa_latched <= arb_rowa; - ba_latched <= arb_ba; - chid_latched <= arb_chid; - end - - if (state[STATE_IDLE_BIT]) - cola_latched <= arb_cola; - else if (state[STATE_ADDR_INC_BIT]) - cola_latched <= cola_latched + last_used_burst; - - end - - assign dec_cola = cola_latched; - assign dec_rowa = rowa_latched; - assign dec_ba = ba_latched; - assign dec_chid = chid_latched; - - - //-------------------------------------------------------------------------------------------------- - // alligned burst max cycles is 4 - // burst [3:2] == 0 & burst[1:0] <= available_burst. 1 cycle is burst - // burst [3:2] != 0 & burst[1:0] <= available_burst. 1 cycle is burst shift_cnt burst_done - // burst [ 1.. 4] : encoded with [ 4'd0 : 4'd3] : cycle is 1 : burst_shift_cnt = 4'b0000 1 - // burst [ 5.. 8] : encoded with [ 4'd4 : 4'd7] : cycle is 2 : burst_shift_cnt = 4'b0001 0 - // burst [ 9..12] : encoded with [ 4'd8 : 4'd11] : cycle is 3 : burst_shift_cnt = 4'b0010 0 - // burst [13..16] : encoded with [4'd12 : 4'd15] : cycle is 4 : burst_shift_cnt = 4'b0100 0 - // - - // not alligned burst max cycles is 5 shift_cnt burst_done - // burst [ 1.. 4] : encoded with [ 4'd0 : 4'd3] : cycle is 2 : burst_shift_cnt = 4'b0001 0 - // burst [ 5.. 8] : encoded with [ 4'd4 : 4'd7] : cycle is 3 : burst_shift_cnt = 4'b0010 0 - // burst [ 9..12] : encoded with [ 4'd8 : 4'd11] : cycle is 4 : burst_shift_cnt = 4'b0100 0 - // burst [13..16] : encoded with [4'd12 : 4'd15] : cycle is 5 : burst_shift_cnt = 4'b1000 0 - //-------------------------------------------------------------------------------------------------- - - always_ff @(posedge clk) begin : burst_latch_logic - if (state[STATE_IDLE_BIT]) - burst_latched = arb_burst; - end - - // remember that burst has -1 offset - // available burst has -1 offset too - - assign available_burst = 4'b0011 - {2'b00, cola_latched[1:0]}; - - assign remained_burst = burst_latched - available_burst - 1'b1; - assign remained_burst_high = remained_burst[3:2]; - assign remained_burst_low = remained_burst[1:0]; - - assign early_burst_done = burst_shift_cnt[0]; - - always_ff @(posedge clk) begin : burst_logic - if (state[STATE_DECODE_BIT]) begin - - if (burst_latched <= available_burst) begin - - burst_shift_cnt <= '0; - - burst_done <= 1'b1; // only 1 transaction will be - dec_burst <= burst_latched[1:0]; - - end - else begin - - burst_shift_cnt <= '0; - burst_shift_cnt[remained_burst_high] <= 1'b1; - - remained_burst_low_latched <= remained_burst_low; - - burst_done <= 1'b0; // more then 2 transaction will be - - dec_burst <= available_burst[1:0]; - last_used_burst <= {2'b00, available_burst[1:0]} + 1'b1; // + 1 is compensation of -1 offset - - end - end - else if (state[STATE_ADDR_INC_BIT]) begin - - burst_shift_cnt <= burst_shift_cnt >> 1; - - burst_done <= early_burst_done; - // - if (early_burst_done) - dec_burst <= remained_burst_low_latched; // no transaction any more - else - dec_burst <= 2'b11; - // - last_used_burst <= 4'b0011 + 1'b1; - end - end - -endmodule
trunk/rtl/hssdrc_decoder_state.v Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/rtl/hssdrc_data_path_p1.v =================================================================== --- trunk/rtl/hssdrc_data_path_p1.v (revision 2) +++ trunk/rtl/hssdrc_data_path_p1.v (nonexistent) @@ -1,429 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:52:43 $ -// -// Workfile : hssdrc_data_path_p1.v -// -// Description : sdram data (data & mask) path unit -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -`include "hssdrc_timescale.vh" - -`include "hssdrc_timing.vh" -`include "hssdrc_define.vh" - -module hssdrc_data_path_p1 ( - clk , - reset , - sclr , - // - sys_wdata , - sys_wdatam , - sys_use_wdata , - sys_vld_rdata , - sys_chid_o , - sys_rdata , - // - arb_read , - arb_write , - arb_chid , - arb_burst , - // - dq , - dqm - ); - - input wire clk; - input wire reset; - input wire sclr; - - //-------------------------------------------------------------------------------------------------- - // system data interface - //-------------------------------------------------------------------------------------------------- - - input data_t sys_wdata ; - input datam_t sys_wdatam ; - output logic sys_use_wdata ; - output logic sys_vld_rdata ; - output chid_t sys_chid_o ; - output data_t sys_rdata ; - - //-------------------------------------------------------------------------------------------------- - // interface from arbiter throw multiplexer - //-------------------------------------------------------------------------------------------------- - - input wire arb_read ; - input wire arb_write ; - input chid_t arb_chid ; - input sdram_burst_t arb_burst ; - - //-------------------------------------------------------------------------------------------------- - // interface sdram chip - //-------------------------------------------------------------------------------------------------- - - inout wire [pDataBits-1 :0] dq; - output logic [pDatamBits-1 :0] dqm; - - //-------------------------------------------------------------------------------------------------- - // Mask paramters count via pBL, pCL parameters only for clarify. - // unit has been designed to use fixed lengh mask patterns - //-------------------------------------------------------------------------------------------------- - localparam cWDataMask = cSdramBL - 1; // - 1 cycle for write command itself - - localparam cRDataMask = cSdramBL - 1 + pCL - 2; // - 1 cycle for read command itself, - // - 2 cycle for read dqm latency - - localparam cDataMask = max(cWDataMask, cRDataMask); - - localparam cReadAllign = pCL + 1 + 1; // + 1 is capture register cycle - // + 1 is additition command latency - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - data_t wdata_delayed; - logic use_wdata_delayed; - - logic [3:0] use_wdata_srl; - wire use_wdata; - wire use_wdatam; - - logic [cDataMask-1 : 0] datam_srl; - logic datam; - - - logic [3:0] vld_rdata_srl; - logic vld_rdata; - logic vld_rdata_allign_srl [cReadAllign-1 : 0]; - - chid_t chid_srl [3:0]; - chid_t chid; - chid_t chid_allign_srl [cReadAllign-1 : 0]; - - //-------------------------------------------------------------------------------------------------- - // use write data & mask - //-------------------------------------------------------------------------------------------------- - - always_ff @(posedge clk or posedge reset) begin : use_wdata_generate - if (reset) - use_wdata_srl <= 4'b0000; - else if (sclr) - use_wdata_srl <= 4'b0000; - else if (arb_write) - unique case (arb_burst) - 2'h0 : use_wdata_srl <= 4'b1000; - 2'h1 : use_wdata_srl <= 4'b1100; - 2'h2 : use_wdata_srl <= 4'b1110; - 2'h3 : use_wdata_srl <= 4'b1111; - endcase - else - use_wdata_srl <= (use_wdata_srl << 1); - end - - assign use_wdata = use_wdata_srl[3]; - assign use_wdatam = use_wdata_srl[3]; - - // - // read/write data mask for command terminate - // - - always_ff @(posedge clk or posedge reset) begin : data_burst_mask_generate - if (reset) - datam_srl <= '0; - else if (sclr) - datam_srl <= '0; - else begin - if (arb_write) - datam_srl <= WriteMaskBits(arb_burst); - else if (arb_read) - datam_srl <= ReadMaskBits(arb_burst); - else - datam_srl <= (datam_srl << 1); - end - end - - always_ff @(posedge clk or posedge reset) begin : data_mask_generate - if (reset) - datam <= 1'b0; - else if (sclr) - datam <= 1'b0; - else begin - if (arb_write) - datam <= 1'b0; - else if (arb_read) - datam <= FirstReadMaskBit(arb_burst); - else - datam <= datam_srl [cDataMask-1]; - end - end - - // - // dqm - // - - - always_ff @(posedge clk or posedge reset) begin - if (reset) - dqm <= '0; - else if (sclr) - dqm <= '0; - else - dqm <= use_wdatam ? sys_wdatam : {pDatamBits{datam}}; - end - - - //-------------------------------------------------------------------------------------------------- - // write data request - //-------------------------------------------------------------------------------------------------- - -`ifndef HSSDRC_COMBINATORY_USE_WDATA - - assign sys_use_wdata = use_wdata; - -`else - - logic [2:0] use_wdata_srl_small; - - always_ff @(posedge clk or posedge reset) begin : use_wdata_small_generate - if (reset) - use_wdata_srl_small <= 3'b000; - else if (sclr) - use_wdata_srl_small <= 3'b000; - else if (arb_write) - unique case (arb_burst) - 2'h0 : use_wdata_srl_small <= 3'b000; - 2'h1 : use_wdata_srl_small <= 3'b100; - 2'h2 : use_wdata_srl_small <= 3'b110; - 2'h3 : use_wdata_srl_small <= 3'b111; - endcase - else - use_wdata_srl_small <= (use_wdata_srl_small << 1); - end - - assign sys_use_wdata = arb_write | use_wdata_srl_small[2]; - -`endif - // - // dq - // - - - always_ff @(posedge clk) begin : wdata_reclock - wdata_delayed <= sys_wdata; - end - - always_ff @(posedge clk or posedge reset) begin : use_wdata_reclock - if (reset) - use_wdata_delayed <= 1'b0; - else - use_wdata_delayed <= use_wdata; - end - - - assign dq = use_wdata_delayed ? wdata_delayed : {pDataBits{1'bz}}; - - //-------------------------------------------------------------------------------------------------- - // read data - //-------------------------------------------------------------------------------------------------- - - always_ff @(posedge clk or posedge reset) begin : vld_rdata_generate - if (reset) - vld_rdata_srl <= 4'b0000; - else if (sclr) - vld_rdata_srl <= 4'b0000; - else if (arb_read) - unique case (arb_burst) - 2'h0 : vld_rdata_srl <= 4'b1000; - 2'h1 : vld_rdata_srl <= 4'b1100; - 2'h2 : vld_rdata_srl <= 4'b1110; - 2'h3 : vld_rdata_srl <= 4'b1111; - endcase - else - vld_rdata_srl <= (vld_rdata_srl << 1); - end - - assign vld_rdata = vld_rdata_srl [3]; - - // - // - // - - always_ff @(posedge clk) begin : chid_rdata_generate - int i; - - if (arb_read) begin - for (i = 0; i < 4; i++) - chid_srl[i] <= arb_chid; // load all with chid - end - else begin - for (i = 1; i < 4; i++) - chid_srl[i] <= chid_srl[i-1]; // shift left with last data stable - end - end - - assign chid = chid_srl [3]; - - // - // - // - - always_ff @(posedge clk or posedge reset) begin : vld_rdata_allign_generate - int i; - - if (reset) begin - for (i = 0; i < cReadAllign; i++) - vld_rdata_allign_srl[i] <= 1'b0; - end - else if (sclr) begin - for (i = 0; i < cReadAllign; i++) - vld_rdata_allign_srl[i] <= 1'b0; - end - else begin - vld_rdata_allign_srl[0] <= vld_rdata; // shift left - - for (i = 1; i < cReadAllign; i++) - vld_rdata_allign_srl[i] <= vld_rdata_allign_srl [i-1]; - end - end - - - assign sys_vld_rdata = vld_rdata_allign_srl [cReadAllign-1]; - - // - // - // - - always_ff @(posedge clk) begin : chid_allign_generate - int i; - - chid_allign_srl[0] <= chid; // shift left - - for (i = 1; i < cReadAllign; i++) - chid_allign_srl[i] <= chid_allign_srl[i-1]; - end - - - assign sys_chid_o = chid_allign_srl [cReadAllign-1]; - - // - // - // - - always_ff @(posedge clk) begin : rdata_reclock - sys_rdata <= dq; - end - - //-------------------------------------------------------------------------------------------------- - // function to count write bit mask pattern for different burst value and - // for different Cas Latency paramter value - // full burst == 2'h3 no need to be masked - //-------------------------------------------------------------------------------------------------- - - function automatic bit [cDataMask-1:0] WriteMaskBits (input bit [1:0] burst); - if (pCL == 3) begin - WriteMaskBits = 4'b0000; - case (burst) - 2'h0 : WriteMaskBits = 4'b1110; - 2'h1 : WriteMaskBits = 4'b0110; - 2'h2 : WriteMaskBits = 4'b0010; - endcase - end - else if (pCL == 2) begin - WriteMaskBits = 3'b000; - case (burst) - 2'h0 : WriteMaskBits = 3'b111; - 2'h1 : WriteMaskBits = 3'b011; - 2'h2 : WriteMaskBits = 3'b001; - endcase - end - else if (pCL == 1) begin - WriteMaskBits = 3'b000; - case (burst) - 2'h0 : WriteMaskBits = 3'b111; - 2'h1 : WriteMaskBits = 3'b011; - 2'h2 : WriteMaskBits = 3'b001; - endcase - end - else begin - WriteMaskBits = '0; - end - endfunction - - //-------------------------------------------------------------------------------------------------- - // function to count first read bit mask pattern for different burst value and - // for different Cas Latency paramter value - //-------------------------------------------------------------------------------------------------- - - function automatic bit FirstReadMaskBit (input bit [1:0] burst); - if ((pCL == 1) && (burst == 0)) - FirstReadMaskBit = 1'b1; - else - FirstReadMaskBit = 1'b0; - endfunction - - //-------------------------------------------------------------------------------------------------- - // function to count read bit mask pattern for different burst value and - // for different Cas Latency paramter value - // full burst == 2'h3 no need to be masked - //-------------------------------------------------------------------------------------------------- - - function automatic bit [cDataMask-1:0] ReadMaskBits (input bit [1:0] burst); - if (pCL == 3) begin - ReadMaskBits = 4'b0000; - case (burst) - 2'h0 : ReadMaskBits = 4'b0111; - 2'h1 : ReadMaskBits = 4'b0011; - 2'h2 : ReadMaskBits = 4'b0001; - endcase - end - else if (pCL == 2) begin - ReadMaskBits = 3'b000; - case (burst) - 2'h0 : ReadMaskBits = 3'b111; - 2'h1 : ReadMaskBits = 3'b011; - 2'h2 : ReadMaskBits = 3'b001; - endcase - end - else if (pCL == 1) begin - ReadMaskBits = 3'b000; - case (burst) - 2'h0 : ReadMaskBits = 3'b110; - 2'h1 : ReadMaskBits = 3'b110; - 2'h2 : ReadMaskBits = 3'b010; - endcase - end - else begin - ReadMaskBits = '0; - end - endfunction - -endmodule
trunk/rtl/hssdrc_data_path_p1.v Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/rtl/hssdrc_decoder.v =================================================================== --- trunk/rtl/hssdrc_decoder.v (revision 2) +++ trunk/rtl/hssdrc_decoder.v (nonexistent) @@ -1,477 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:52:43 $ -// -// Workfile : hssdrc_decoder.v -// -// Description : sdram command sequence decoder's array -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -`include "hssdrc_timescale.vh" - -`include "hssdrc_define.vh" - -module hssdrc_decoder ( - clk , - reset , - sclr , - // - ba_map_update , - ba_map_clear , - ba_map_ba , - ba_map_rowa , - ba_map_pre_act_rw , - ba_map_act_rw , - ba_map_rw , - ba_map_all_close , - // - arb0_write , - arb0_read , - arb0_refr , - arb0_rowa , - arb0_cola , - arb0_ba , - arb0_burst , - arb0_chid , - arb0_ready , - // - arb1_write , - arb1_read , - arb1_refr , - arb1_rowa , - arb1_cola , - arb1_ba , - arb1_burst , - arb1_chid , - arb1_ready , - // - arb2_write , - arb2_read , - arb2_refr , - arb2_rowa , - arb2_cola , - arb2_ba , - arb2_burst , - arb2_chid , - arb2_ready , - // - dec0_pre_all , - dec0_refr , - dec0_pre , - dec0_act , - dec0_read , - dec0_write , - dec0_pre_all_enable , - dec0_refr_enable , - dec0_pre_enable , - dec0_act_enable , - dec0_read_enable , - dec0_write_enable , - dec0_locked , - dec0_last , - dec0_rowa , - dec0_cola , - dec0_ba , - dec0_chid , - dec0_burst , - // - dec1_pre_all , - dec1_refr , - dec1_pre , - dec1_act , - dec1_read , - dec1_write , - dec1_pre_all_enable , - dec1_refr_enable , - dec1_pre_enable , - dec1_act_enable , - dec1_read_enable , - dec1_write_enable , - dec1_locked , - dec1_last , - dec1_rowa , - dec1_cola , - dec1_ba , - dec1_chid , - dec1_burst , - // - dec2_pre_all , - dec2_refr , - dec2_pre , - dec2_act , - dec2_read , - dec2_write , - dec2_pre_all_enable , - dec2_refr_enable , - dec2_pre_enable , - dec2_act_enable , - dec2_read_enable , - dec2_write_enable , - dec2_locked , - dec2_last , - dec2_rowa , - dec2_cola , - dec2_ba , - dec2_chid , - dec2_burst - ); - - input wire clk ; - input wire reset; - input wire sclr ; - - //-------------------------------------------------------------------------------------------------- - // bank map interface - //-------------------------------------------------------------------------------------------------- - - output wire ba_map_update ; - output wire ba_map_clear ; - output ba_t ba_map_ba ; - output rowa_t ba_map_rowa ; - input wire ba_map_pre_act_rw; - input wire ba_map_act_rw ; - input wire ba_map_rw ; - input wire ba_map_all_close ; - - //-------------------------------------------------------------------------------------------------- - // interface from input arbiter - //-------------------------------------------------------------------------------------------------- - - input logic arb0_write ; - input logic arb0_read ; - input logic arb0_refr ; - input rowa_t arb0_rowa ; - input cola_t arb0_cola ; - input ba_t arb0_ba ; - input burst_t arb0_burst ; - input chid_t arb0_chid ; - output wire arb0_ready ; - // - input logic arb1_write ; - input logic arb1_read ; - input logic arb1_refr ; - input rowa_t arb1_rowa ; - input cola_t arb1_cola ; - input ba_t arb1_ba ; - input burst_t arb1_burst ; - input chid_t arb1_chid ; - output wire arb1_ready ; - // - input logic arb2_write ; - input logic arb2_read ; - input logic arb2_refr ; - input rowa_t arb2_rowa ; - input cola_t arb2_cola ; - input ba_t arb2_ba ; - input burst_t arb2_burst ; - input chid_t arb2_chid ; - output wire arb2_ready ; - - //-------------------------------------------------------------------------------------------------- - // inteface to output arbiter - //-------------------------------------------------------------------------------------------------- - - output logic dec0_pre_all ; - output logic dec0_refr ; - output logic dec0_pre ; - output logic dec0_act ; - output logic dec0_read ; - output logic dec0_write ; - input wire dec0_pre_all_enable; - input wire dec0_refr_enable ; - input wire dec0_pre_enable ; - input wire dec0_act_enable ; - input wire dec0_read_enable ; - input wire dec0_write_enable ; - output logic dec0_locked ; - output logic dec0_last ; - output rowa_t dec0_rowa ; - output cola_t dec0_cola ; - output ba_t dec0_ba ; - output chid_t dec0_chid ; - output sdram_burst_t dec0_burst ; - // - output logic dec1_pre_all ; - output logic dec1_refr ; - output logic dec1_pre ; - output logic dec1_act ; - output logic dec1_read ; - output logic dec1_write ; - input wire dec1_pre_all_enable; - input wire dec1_refr_enable ; - input wire dec1_pre_enable ; - input wire dec1_act_enable ; - input wire dec1_read_enable ; - input wire dec1_write_enable ; - output logic dec1_locked ; - output logic dec1_last ; - output rowa_t dec1_rowa ; - output cola_t dec1_cola ; - output ba_t dec1_ba ; - output chid_t dec1_chid ; - output sdram_burst_t dec1_burst ; - // - output logic dec2_pre_all ; - output logic dec2_refr ; - output logic dec2_pre ; - output logic dec2_act ; - output logic dec2_read ; - output logic dec2_write ; - input wire dec2_pre_all_enable; - input wire dec2_refr_enable ; - input wire dec2_pre_enable ; - input wire dec2_act_enable ; - input wire dec2_read_enable ; - input wire dec2_write_enable ; - output logic dec2_locked ; - output logic dec2_last ; - output rowa_t dec2_rowa ; - output cola_t dec2_cola ; - output ba_t dec2_ba ; - output chid_t dec2_chid ; - output sdram_burst_t dec2_burst ; - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - ba_t ba_latched ; - rowa_t rowa_latched; - - // - // local state ba_map signals - // - - wire state0__ba_map_update ; - wire state0__ba_map_clear ; - wire state0__ba_map_pre_act_rw ; - wire state0__ba_map_act_rw ; - wire state0__ba_map_rw ; - wire state0__ba_map_all_close ; - - wire state1__ba_map_update ; - wire state1__ba_map_clear ; - wire state1__ba_map_pre_act_rw ; - wire state1__ba_map_act_rw ; - wire state1__ba_map_rw ; - wire state1__ba_map_all_close ; - - wire state2__ba_map_update ; - wire state2__ba_map_clear ; - wire state2__ba_map_pre_act_rw ; - wire state2__ba_map_act_rw ; - wire state2__ba_map_rw ; - wire state2__ba_map_all_close ; - - //-------------------------------------------------------------------------------------------------- - // we can capture bank map data into register, becouse we have +1 tick in FSM - // for bank map decoding we can take data from any arbiter channel - //-------------------------------------------------------------------------------------------------- - - always_ff @(posedge clk) begin : ba_map_data_register - ba_latched <= arb0_ba; - rowa_latched <= arb0_rowa; - end - - // - // - // - - assign ba_map_ba = ba_latched; - assign ba_map_rowa = rowa_latched; - assign ba_map_update = state0__ba_map_update | state1__ba_map_update | state2__ba_map_update ; - assign ba_map_clear = state0__ba_map_clear | state1__ba_map_clear | state2__ba_map_clear ; - - assign state0__ba_map_pre_act_rw = ba_map_pre_act_rw ; - assign state0__ba_map_act_rw = ba_map_act_rw ; - assign state0__ba_map_rw = ba_map_rw ; - assign state0__ba_map_all_close = ba_map_all_close ; - - assign state1__ba_map_pre_act_rw = ba_map_pre_act_rw ; - assign state1__ba_map_act_rw = ba_map_act_rw ; - assign state1__ba_map_rw = ba_map_rw ; - assign state1__ba_map_all_close = ba_map_all_close ; - - assign state2__ba_map_pre_act_rw = ba_map_pre_act_rw ; - assign state2__ba_map_act_rw = ba_map_act_rw ; - assign state2__ba_map_rw = ba_map_rw ; - assign state2__ba_map_all_close = ba_map_all_close ; - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - hssdrc_decoder_state state0 ( - .clk (clk ), - .reset (reset), - .sclr (sclr ), - // - .ba_map_update (state0__ba_map_update ), - .ba_map_clear (state0__ba_map_clear ), - .ba_map_pre_act_rw (state0__ba_map_pre_act_rw), - .ba_map_act_rw (state0__ba_map_act_rw ), - .ba_map_rw (state0__ba_map_rw ), - .ba_map_all_close (state0__ba_map_all_close ), - // - .arb_write (arb0_write), - .arb_read (arb0_read ), - .arb_refr (arb0_refr ), - .arb_rowa (arb0_rowa ), - .arb_cola (arb0_cola ), - .arb_ba (arb0_ba ), - .arb_burst (arb0_burst), - .arb_chid (arb0_chid ), - .arb_ready (arb0_ready), - // - .dec_pre_all (dec0_pre_all), - .dec_refr (dec0_refr ), - .dec_pre (dec0_pre ), - .dec_act (dec0_act ), - .dec_read (dec0_read ), - .dec_write (dec0_write ), - // - .dec_pre_all_enable(dec0_pre_all_enable), - .dec_refr_enable (dec0_refr_enable ), - .dec_pre_enable (dec0_pre_enable ), - .dec_act_enable (dec0_act_enable ), - .dec_read_enable (dec0_read_enable ), - .dec_write_enable (dec0_write_enable ), - // - .dec_locked (dec0_locked), - .dec_last (dec0_last ), - // - .dec_rowa (dec0_rowa ), - .dec_cola (dec0_cola ), - .dec_ba (dec0_ba ), - .dec_chid (dec0_chid ), - // - .dec_burst (dec0_burst) - ); - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - hssdrc_decoder_state state1 ( - .clk (clk ), - .reset (reset), - .sclr (sclr ), - // - .ba_map_update (state1__ba_map_update ), - .ba_map_clear (state1__ba_map_clear ), - .ba_map_pre_act_rw (state1__ba_map_pre_act_rw), - .ba_map_act_rw (state1__ba_map_act_rw ), - .ba_map_rw (state1__ba_map_rw ), - .ba_map_all_close (state1__ba_map_all_close ), - // - .arb_write (arb1_write), - .arb_read (arb1_read ), - .arb_refr (arb1_refr ), - .arb_rowa (arb1_rowa ), - .arb_cola (arb1_cola ), - .arb_ba (arb1_ba ), - .arb_burst (arb1_burst), - .arb_chid (arb1_chid ), - .arb_ready (arb1_ready), - // - .dec_pre_all (dec1_pre_all), - .dec_refr (dec1_refr ), - .dec_pre (dec1_pre ), - .dec_act (dec1_act ), - .dec_read (dec1_read ), - .dec_write (dec1_write ), - // - .dec_pre_all_enable(dec1_pre_all_enable), - .dec_refr_enable (dec1_refr_enable ), - .dec_pre_enable (dec1_pre_enable ), - .dec_act_enable (dec1_act_enable ), - .dec_read_enable (dec1_read_enable ), - .dec_write_enable (dec1_write_enable ), - // - .dec_locked (dec1_locked), - .dec_last (dec1_last ), - // - .dec_rowa (dec1_rowa ), - .dec_cola (dec1_cola ), - .dec_ba (dec1_ba ), - .dec_chid (dec1_chid ), - // - .dec_burst (dec1_burst) - ); - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - hssdrc_decoder_state state2 ( - .clk (clk ), - .reset (reset), - .sclr (sclr ), - // - .ba_map_update (state2__ba_map_update ), - .ba_map_clear (state2__ba_map_clear ), - .ba_map_pre_act_rw (state2__ba_map_pre_act_rw), - .ba_map_act_rw (state2__ba_map_act_rw ), - .ba_map_rw (state2__ba_map_rw ), - .ba_map_all_close (state2__ba_map_all_close ), - // - .arb_write (arb2_write), - .arb_read (arb2_read ), - .arb_refr (arb2_refr ), - .arb_rowa (arb2_rowa ), - .arb_cola (arb2_cola ), - .arb_ba (arb2_ba ), - .arb_burst (arb2_burst), - .arb_chid (arb2_chid ), - .arb_ready (arb2_ready), - // - .dec_pre_all (dec2_pre_all), - .dec_refr (dec2_refr ), - .dec_pre (dec2_pre ), - .dec_act (dec2_act ), - .dec_read (dec2_read ), - .dec_write (dec2_write ), - // - .dec_pre_all_enable(dec2_pre_all_enable), - .dec_refr_enable (dec2_refr_enable ), - .dec_pre_enable (dec2_pre_enable ), - .dec_act_enable (dec2_act_enable ), - .dec_read_enable (dec2_read_enable ), - .dec_write_enable (dec2_write_enable ), - // - .dec_locked (dec2_locked), - .dec_last (dec2_last ), - // - .dec_rowa (dec2_rowa ), - .dec_cola (dec2_cola ), - .dec_ba (dec2_ba ), - .dec_chid (dec2_chid ), - // - .dec_burst (dec2_burst) - ); - -endmodule
trunk/rtl/hssdrc_decoder.v Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/rtl/hssdrc_addr_path_p1.v =================================================================== --- trunk/rtl/hssdrc_addr_path_p1.v (revision 2) +++ trunk/rtl/hssdrc_addr_path_p1.v (nonexistent) @@ -1,216 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:52:43 $ -// -// Workfile : hssdrc_addr_path_p1.v -// -// Description : coder for translate logical onehot command to sdram command -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -`include "hssdrc_timescale.vh" - -`include "hssdrc_define.vh" - - -module hssdrc_addr_path_p1( - clk , - reset , - sclr , - // - arb_pre_all , - arb_refr , - arb_pre , - arb_act , - arb_read , - arb_write , - arb_lmr , - arb_rowa , - arb_cola , - arb_ba , - // - addr , - ba , - cke , - cs_n , - ras_n , - cas_n , - we_n - ); - - input wire clk; - input wire reset; - input wire sclr; - - //-------------------------------------------------------------------------------------------------- - // interface from output arbiter - //-------------------------------------------------------------------------------------------------- - - input wire arb_pre_all ; - input wire arb_refr ; - input wire arb_pre ; - input wire arb_act ; - input wire arb_read ; - input wire arb_write ; - input wire arb_lmr ; - input rowa_t arb_rowa ; - input cola_t arb_cola ; - input ba_t arb_ba ; - - //-------------------------------------------------------------------------------------------------- - // interface to sdram - //-------------------------------------------------------------------------------------------------- - - output sdram_addr_t addr; - output ba_t ba; - output logic cke; - output logic cs_n; - output logic ras_n; - output logic cas_n; - output logic we_n; - - // - // - // - - logic [3:0] cs_n__ras_n__cas_n__we_n; - - sdram_addr_t addr_latched; - ba_t ba_latched; - - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - always_ff @(posedge clk or posedge reset) begin : logical_command_decode - if (reset) - cs_n__ras_n__cas_n__we_n <= 4'b1111; // inheribit nop - else if (sclr) - cs_n__ras_n__cas_n__we_n <= 4'b1111; // inheribit nop - else begin - unique case (1'b1) - arb_pre_all : cs_n__ras_n__cas_n__we_n <= 4'b0010; // Pre - arb_refr : cs_n__ras_n__cas_n__we_n <= 4'b0001; // Refr - arb_pre : cs_n__ras_n__cas_n__we_n <= 4'b0010; // Pre - arb_act : cs_n__ras_n__cas_n__we_n <= 4'b0011; // Act - arb_write : cs_n__ras_n__cas_n__we_n <= 4'b0100; // Write - arb_read : cs_n__ras_n__cas_n__we_n <= 4'b0101; // Read - arb_lmr : cs_n__ras_n__cas_n__we_n <= 4'b0000; // Lmr (data == address) - default : cs_n__ras_n__cas_n__we_n <= 4'b0111; - endcase - end - end - - // - // don't use clocking disable - // - - assign cke = 1'b1; - - // synthesis translate_off - initial begin - {cs_n, ras_n, cas_n, we_n} <= 4'b1111; // only to disable mt48lc2m warnings - end - // synthesis translate_on - - always_ff @(posedge clk or posedge reset) begin : sdram_control_register - if (reset) {cs_n, ras_n, cas_n, we_n} <= 4'b1111; // inheribit nop - else if (sclr) {cs_n, ras_n, cas_n, we_n} <= 4'b1111; // inheribit nop - else {cs_n, ras_n, cas_n, we_n} <= cs_n__ras_n__cas_n__we_n; - end - - always_ff @(posedge clk) begin : sdram_mux_addr_path - - ba_latched <= arb_ba; - ba <= ba_latched; - - - if (arb_act | arb_lmr) - addr_latched <= ResizeRowa(arb_rowa); - else - addr_latched <= ResizeCola(arb_cola, arb_pre_all); - - addr <= addr_latched; - end - - //-------------------------------------------------------------------------------------------------- - // function to get sdram address from row address. row address is transfered during - // act/lmr sdram command and is directly mapped to row address. - //-------------------------------------------------------------------------------------------------- - - function sdram_addr_t ResizeRowa (input rowa_t rowa); - int i; - sdram_addr_t addr_resized; - - for (i = 0; i < pSdramAddrBits; i++) begin - if (pRowaBits > i) - addr_resized[i] = rowa[i]; - else - addr_resized[i] = 1'b0; - end - - return addr_resized; - endfunction - - //-------------------------------------------------------------------------------------------------- - // function to get sdram address from column address. column address is transfered during : - // 1. read/write sdram command and A10 is autoprecharge bit and if pColaBits > 10 then - // cola [$:10] is mapped to addr [$:11]. - // 2. pre sdram command and A10 is select all banks bit - //-------------------------------------------------------------------------------------------------- - - function sdram_addr_t ResizeCola (input cola_t cola, input bit pre_all); - int i; - sdram_addr_t addr_resized; - - for (i = 0; i < pSdramAddrBits; i++) begin - if (i < 10) begin - if (pColaBits > i) - addr_resized[i] = cola[i]; - else - addr_resized[i] = 1'b0; - end - else if (i == 10) begin - addr_resized[i] = pre_all; // Autoprecharge is not used -> A10 is always 1'b0 then read/write active - end - else begin - if (pColaBits > i) - addr_resized[i] = cola[i-1]; - else - addr_resized[i] = 1'b0; - end - end - - return addr_resized; - endfunction - -endmodule
trunk/rtl/hssdrc_addr_path_p1.v Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/rtl/hssdrc_addr_path.v =================================================================== --- trunk/rtl/hssdrc_addr_path.v (revision 2) +++ trunk/rtl/hssdrc_addr_path.v (nonexistent) @@ -1,207 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:52:43 $ -// -// Workfile : hssdrc_addr_path.v -// -// Description : coder for translate logical onehot command to sdram command -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -`include "hssdrc_timescale.vh" - -`include "hssdrc_define.vh" - - -module hssdrc_addr_path( - clk , - reset , - sclr , - // - arb_pre_all , - arb_refr , - arb_pre , - arb_act , - arb_read , - arb_write , - arb_lmr , - arb_rowa , - arb_cola , - arb_ba , - // - addr , - ba , - cke , - cs_n , - ras_n , - cas_n , - we_n - ); - - input wire clk; - input wire reset; - input wire sclr; - - //-------------------------------------------------------------------------------------------------- - // interface from output arbiter - //-------------------------------------------------------------------------------------------------- - - input wire arb_pre_all ; - input wire arb_refr ; - input wire arb_pre ; - input wire arb_act ; - input wire arb_read ; - input wire arb_write ; - input wire arb_lmr ; - input rowa_t arb_rowa ; - input cola_t arb_cola ; - input ba_t arb_ba ; - - //-------------------------------------------------------------------------------------------------- - // interface to sdram - //-------------------------------------------------------------------------------------------------- - - output sdram_addr_t addr; - output ba_t ba; - output logic cke; - output logic cs_n; - output logic ras_n; - output logic cas_n; - output logic we_n; - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - logic [3:0] cs_n__ras_n__cas_n__we_n; - - // synthesis translate_off - wire [6:0] arb_cmd = {arb_pre_all, arb_refr, arb_pre, arb_act, arb_write, arb_read, arb_lmr}; - arb_cmd_assert : assert property (@(posedge clk) disable iff (reset) (arb_cmd !== 0) |-> $onehot(arb_cmd)); - // synthesis translate_on - - always_comb begin : logical_command_decode - - cs_n__ras_n__cas_n__we_n = 4'b0111; // nop - - unique case (1'b1) - arb_pre_all : cs_n__ras_n__cas_n__we_n = 4'b0010; // Pre - arb_refr : cs_n__ras_n__cas_n__we_n = 4'b0001; // Refr - arb_pre : cs_n__ras_n__cas_n__we_n = 4'b0010; // Pre - arb_act : cs_n__ras_n__cas_n__we_n = 4'b0011; // Act - arb_write : cs_n__ras_n__cas_n__we_n = 4'b0100; // Write - arb_read : cs_n__ras_n__cas_n__we_n = 4'b0101; // Read - arb_lmr : cs_n__ras_n__cas_n__we_n = 4'b0000; // Lmr (data == address) - default : begin end - endcase - end - - // - // don't use clocking disable - // - - assign cke = 1'b1; - - // synthesis translate_off - initial begin - {cs_n, ras_n, cas_n, we_n} <= 4'b1111; // only to disable mt48lc2m warnings - end - // synthesis translate_on - - always_ff @(posedge clk or posedge reset) begin : sdram_control_register - if (reset) {cs_n, ras_n, cas_n, we_n} <= 4'b1111; // inheribit nop - else if (sclr) {cs_n, ras_n, cas_n, we_n} <= 4'b1111; // inheribit nop - else {cs_n, ras_n, cas_n, we_n} <= cs_n__ras_n__cas_n__we_n; - end - - always_ff @(posedge clk) begin : sdram_mux_addr_path - - ba <= arb_ba; - - if (arb_act | arb_lmr) - addr <= ResizeRowa(arb_rowa); - else - addr <= ResizeCola(arb_cola, arb_pre_all); - - end - - //-------------------------------------------------------------------------------------------------- - // function to get sdram address from row address. row address is transfered during - // act/lmr sdram command and is directly mapped to row address. - //-------------------------------------------------------------------------------------------------- - - function sdram_addr_t ResizeRowa (input rowa_t rowa); - int i; - sdram_addr_t addr_resized; - - for (i = 0; i < pSdramAddrBits; i++) begin - if (pRowaBits > i) - addr_resized[i] = rowa[i]; - else - addr_resized[i] = 1'b0; - end - - return addr_resized; - endfunction - - //-------------------------------------------------------------------------------------------------- - // function to get sdram address from column address. column address is transfered during : - // 1. read/write sdram command and A10 is autoprecharge bit and if pColaBits > 10 then - // cola [$:10] is mapped to addr [$:11]. - // 2. pre sdram command and A10 is select all banks bit - //-------------------------------------------------------------------------------------------------- - - function sdram_addr_t ResizeCola (input cola_t cola, input bit pre_all); - int i; - sdram_addr_t addr_resized; - - for (i = 0; i < pSdramAddrBits; i++) begin - if (i < 10) begin - if (pColaBits > i) - addr_resized[i] = cola[i]; - else - addr_resized[i] = 1'b0; - end - else if (i == 10) begin - addr_resized[i] = pre_all; // Autoprecharge is not used -> A10 is always 1'b0 then read/write active - end - else begin - if (pColaBits > i) - addr_resized[i] = cola[i-1]; - else - addr_resized[i] = 1'b0; - end - end - - return addr_resized; - endfunction - -endmodule
trunk/rtl/hssdrc_addr_path.v Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/rtl/hssdrc_mux.v =================================================================== --- trunk/rtl/hssdrc_mux.v (revision 2) +++ trunk/rtl/hssdrc_mux.v (nonexistent) @@ -1,153 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:52:43 $ -// -// Workfile : hssdrc_mux.v -// -// Description : multiplexer for sdram signals -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -`include "hssdrc_timescale.vh" - -`include "hssdrc_define.vh" - -module hssdrc_mux - ( - init_done , - // - init_state_pre_all , - init_state_refr , - init_state_lmr , - init_state_rowa , - // - arb_pre_all , - arb_refr , - arb_pre , - arb_act , - arb_read , - arb_write , - arb_rowa , - arb_cola , - arb_ba , - arb_chid , - arb_burst , - // - mux_pre_all , - mux_refr , - mux_pre , - mux_act , - mux_read , - mux_write , - mux_lmr , - mux_rowa , - mux_cola , - mux_ba , - mux_chid , - mux_burst - ); - - input wire init_done; - - //-------------------------------------------------------------------------------------------------- - // interface from inis state controller - //-------------------------------------------------------------------------------------------------- - - input wire init_state_pre_all ; - input wire init_state_refr ; - input wire init_state_lmr ; - input rowa_t init_state_rowa ; - - //-------------------------------------------------------------------------------------------------- - // interface from output arbiter - //-------------------------------------------------------------------------------------------------- - - input wire arb_pre_all ; - input wire arb_refr ; - input wire arb_pre ; - input wire arb_act ; - input wire arb_read ; - input wire arb_write ; - input rowa_t arb_rowa ; - input cola_t arb_cola ; - input ba_t arb_ba ; - input chid_t arb_chid ; - input sdram_burst_t arb_burst ; - - //-------------------------------------------------------------------------------------------------- - // interface to data/addr path units - //-------------------------------------------------------------------------------------------------- - - output logic mux_pre_all ; - output logic mux_refr ; - output logic mux_pre ; - output logic mux_act ; - output logic mux_read ; - output logic mux_write ; - output logic mux_lmr ; - output rowa_t mux_rowa ; - output cola_t mux_cola ; - output ba_t mux_ba ; - output chid_t mux_chid ; - output sdram_burst_t mux_burst ; - - //------------------------------------------------------------------------------------------------- - // there is no reason to mask or mux arbiter_if signals, becouse during init state phase - // init_done == 0 and this signals is cleared inside decoders and after init state phase - // init_done == 1 and init_state_if signals will be cleared also - //------------------------------------------------------------------------------------------------- - - assign mux_pre_all = arb_pre_all | init_state_pre_all; - assign mux_refr = arb_refr | init_state_refr ; - - // this will be synthesis as simple logic, becouse init_state_rowa is constant - assign mux_rowa = init_done ? arb_rowa : init_state_rowa ; - - assign mux_pre = arb_pre ; - assign mux_act = arb_act ; - assign mux_read = arb_read ; - assign mux_write = arb_write ; - - assign mux_lmr = init_state_lmr; - - // - // no mux becouse init state phase not use this sdram ports - // - - assign mux_cola = arb_cola ; - assign mux_ba = arb_ba ; - assign mux_burst = arb_burst; - assign mux_chid = arb_chid ; - -endmodule - - -
trunk/rtl/hssdrc_mux.v Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/rtl/hssdrc_access_manager.v =================================================================== --- trunk/rtl/hssdrc_access_manager.v (revision 2) +++ trunk/rtl/hssdrc_access_manager.v (nonexistent) @@ -1,538 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:52:43 $ -// -// Workfile : hssdrc_access_manager.v -// -// Description : sdram bank access manager -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -// used command sequenceces -// 1. {pre a -> act a -> rw a} -> {pre a -> act a -> rw a } -// -> {rw a } -// -> {pre_all -> refr} -// 2. {pre a -> act a -> rw a} -> {pre b -> act b -> rw b } -// -> {act b -> rw b} -// -> {rw b } -// -> {pre_all -> refr} -// 3. {pre_all -> refr} -> refr -// -> act -// -// just need to control : -// +-------------------+-------------------------+--------------------------+ -// | command | sequental decoder part | concurent/pipeline part | -// +===================+=========================+==========================+ -// | pre [0] -> | act [0] | act [1,2,3] | -// | pre [0] -> | | pre [1,2,3] | -// +-------------------+-------------------------+--------------------------+ -// | pre [1] -> | act [1] | act [0,2,3] | -// | pre [1] -> | | pre [0,2,3] | -// +-------------------+-------------------------+--------------------------+ -// | pre [2] -> | act [2] | act [0,1,3] | -// | pre [2] -> | | pre [0,1,3] | -// +-------------------+-------------------------+--------------------------+ -// | pre [3] -> | act [3] | act [0,1,2] | -// | pre [3] -> | | pre [0,1,2] | -// +-------------------+-------------------------+--------------------------+ -// | act [0] -> | write [0] | | -// | act [0] -> | | act [1,2,3] | -// | act [0] -> | | pre [0,1,2,3] | -// | act [0] -> | read [0] | | -// +-------------------+-------------------------+--------------------------+ -// | act [1] -> | write [1] | | -// | act [1] -> | | act [0,2,3] | -// | act [1] -> | | pre [0,1,2,3] | -// | act [1] -> | read [1] | | -// +-------------------+-------------------------+--------------------------+ -// | act [2] -> | write [2] | | -// | act [2] -> | | act [0,1,3] | -// | act [2] -> | | pre [0,1,2,3] | -// | act [2] -> | read [2] | | -// +-------------------+-------------------------+--------------------------+ -// | act [3] -> | write [3] | | -// | act [3] -> | | act [0,1,2] | -// | act [3] -> | | pre [0,1,2,3] | -// | act [3] -> | read [3] | | -// +-------------------+-------------------------+--------------------------+ -// | write/read [0] -> | | pre [0,1,2,3] | -// | write/read [0] -> | | act [1,2,3] | -// | write/read [0] -> | | write[0,1,2,3] | -// | write/read [0] -> | | read [0,1,2,3] | -// +-------------------+-------------------------+--------------------------+ -// | write/read [1] -> | | pre [0,1,2,3] | -// | write/read [1] -> | | act [0,2,3] | -// | write/read [1] -> | | write[0,1,2,3] | -// | write/read [1] -> | | read [0,1,2,3] | -// +-------------------+-------------------------+--------------------------+ -// | write/read [2] -> | | pre [0,1,2,3] | -// | write/read [2] -> | | act [0,1,3] | -// | write/read [2] -> | | write[0,1,2,3] | -// | write/read [2] -> | | read [0,1,2,3] | -// +-------------------+-------------------------+--------------------------+ -// | write/read [3] -> | | pre [0,1,2,3] | -// | write/read [3] -> | | act [0,1,2] | -// | write/read [3] -> | | write[0,1,2,3] | -// | write/read [3] -> | | read [0,1,2,3] | -// +-------------------+-------------------------+--------------------------+ -// | pre_all -> | refr | | -// | | | | -// +-------------------+-------------------------+--------------------------+ -// | refr -> | | refr | -// | refr -> | | act[0,1,2,3] | -// +-------------------+-------------------------+--------------------------+ -// -// -// -// +-----------------+---------------+-----------------+---------------------+-----------+ -// | past command | control tread | current command | contol time value | note | -// +=================+===============+=================+=====================+===========+ -// | act [0] | 0 | pre [0] | Tras | | -// | write [0] | 1 | | Twr + Burst | 1,2,3 | -// | read [0] | 2 | | Burst | bank | -// | pre [1,2,3] | | | 0 | is | -// | act [1,2,3] | | | 0 | same | -// | write [1,2,3] | | | 0 | | -// | read [1,2,3] | | | 0 | | -// +-----------------+---------------+-----------------+---------------------+-----------+ -// | pre [0] | 3 [1]_ | act [0] | Trp | | -// | refr | 4 | | Trfc | 1,2,3 | -// | act [0] | 5 | | Trc | | -// | act [1,2,3] | 6 | | Trrd | bank | -// | pre [1,2,3] | | | 0 | is | -// | write [1,2,3] | | | 0 | same | -// | read [1,2,3] | | | 0 | | -// +-----------------+---------------+-----------------+---------------------+-----------+ -// | act [0] | 7 [1]_ | write [0] | Trcd | 1,2,3 | -// | write [0,1,2,3] | 8 | | Burst | bank | -// | read [0,1,2,3] | 9 | | Burst + CL + 1(?bta)| is | -// | | | | | same | -// +-----------------+---------------+-----------------+---------------------+-----------+ -// | act [0] | 10 [1]_ | read [0] | Trcd | 1,2,3 | -// | write [0,1,2,3] | 11 | | Burst + 1(?bta) | bank | -// | read [0,1,2,3] | 12 | | Burst | is | -// | | | | | same | -// +-----------------+---------------+-----------------+---------------------+-----------+ -// | pre_all | 13 | refr | Trp | | -// | refr | 14 | | Trfc | | -// +-----------------+---------------+-----------------+---------------------+-----------+ -// -// ..[1] Trp (pre -> act) & Trcd (act -> read/write) contolled internal in decoder FSM -// - -`include "hssdrc_timescale.vh" - -`include "hssdrc_define.vh" -`include "hssdrc_timing.vh" - -module hssdrc_access_manager ( - clk , - reset , - sclr , - // - arb_pre_all , - arb_refr , - arb_pre , - arb_act , - arb_read , - arb_write , - arb_ba , - arb_burst , - // - am_pre_all_enable , - am_refr_enable , - am_pre_enable , - am_act_enable , - am_read_enable , - am_write_enable - ); - - input wire clk; - input wire reset; - input wire sclr; - - //-------------------------------------------------------------------------------------------------- - // interface from output arbiter - //-------------------------------------------------------------------------------------------------- - - input logic arb_pre_all ; - input logic arb_refr ; - input logic arb_pre ; - input logic arb_act ; - input logic arb_read ; - input logic arb_write ; - input ba_t arb_ba ; - input sdram_burst_t arb_burst ; - - //-------------------------------------------------------------------------------------------------- - // outputs - //-------------------------------------------------------------------------------------------------- - - output logic am_pre_all_enable ; - output logic am_refr_enable ; - output logic [0:3] am_pre_enable ; - output logic [0:3] am_act_enable ; - output logic [0:3] am_read_enable ; - output logic [0:3] am_write_enable ; - - - //-------------------------------------------------------------------------------------------------- - // all timings is select using shift register techique. - // enable is 1'b1 level on output. - // all shift is shift rigth. - // shift register command load pattern is 'b{{x{1'b0}}, {y{1'b1}}} - //-------------------------------------------------------------------------------------------------- - - //-------------------------------------------------------------------------------------------------- - // take into acount load shift register cycle - //-------------------------------------------------------------------------------------------------- - - localparam int cTras_m1 = cTras - 1; - localparam int cTrfc_m1 = cTrfc - 1; -// localparam int cTrc_m1 = cTrc - 1; tras + trp contolled -// localparam int cTrcd_m1 = cTrcd - 1; fsm contolled - localparam int cTwr_m1 = cTwr - 1; - localparam int cTrp_m1 = cTrp - 1; - localparam int cTrrd_m1 = cTrrd - 1; - localparam int cSdramBL_m1 = cSdramBL - 1; - - //-------------------------------------------------------------------------------------------------- - // tread 0/1/2 : Tras (act -> pre) & Twr + Burst (write -> pre) & Burst (read -> write) - // Twr + Burst & Burst control via one register becouse write/read has atomic access - //-------------------------------------------------------------------------------------------------- - - localparam int cPreActEnableLength = max(cTwr_m1 + cSdramBL_m1, cTras_m1); - localparam int cPreRwEnableLength = max(cTwr_m1 + cSdramBL_m1, cTras_m1); - - typedef logic [cPreActEnableLength-1:0] pre_act_enable_srl_t; - typedef logic [cPreRwEnableLength-1 :0] pre_rw_enable_srl_t; - - // to pre load patterns - localparam pre_act_enable_srl_t cPreActEnableInitValue = {cPreActEnableLength{1'b1}}; - localparam pre_act_enable_srl_t cPreActEnableActValue = PercentRelation(cTras_m1, cPreActEnableLength); - - // to pre load patterns - localparam pre_rw_enable_srl_t cPreRwEnableInitValue = {cPreRwEnableLength{1'b1}}; - - // Remember : burst already has -1 offset (!!!!) - function automatic pre_rw_enable_srl_t PreRwEnableWriteValue (input sdram_burst_t burst); - PreRwEnableWriteValue = PercentRelation (cTwr_m1 + burst, cPreRwEnableLength); - endfunction - - function automatic pre_rw_enable_srl_t PreRwEnableReadValue (input sdram_burst_t burst); - PreRwEnableReadValue = PercentRelation (burst, cPreRwEnableLength); - endfunction - - // each bank has own control registers - pre_act_enable_srl_t pre_act_enable_srl [0:3]; - pre_rw_enable_srl_t pre_rw_enable_srl [0:3]; - - wire [0:3] pre_enable ; - - genvar p; - - generate - - for (p = 0; p < 4; p++) begin : pre_enable_generate - - always_ff @(posedge clk or posedge reset) begin : pre_enable_shift_register - - if (reset) - pre_act_enable_srl [p] <= cPreActEnableInitValue; - else if (sclr) - pre_act_enable_srl [p] <= cPreActEnableInitValue; - else begin - if (arb_act && (arb_ba == p)) - pre_act_enable_srl [p] <= cPreActEnableActValue; - else - pre_act_enable_srl [p] <= (pre_act_enable_srl [p] << 1) | 1'b1; - end - - - if (reset) - pre_rw_enable_srl [p] <= cPreRwEnableInitValue; - else if (sclr) - pre_rw_enable_srl [p] <= cPreRwEnableInitValue; - else begin - if (arb_write && (arb_ba == p)) - pre_rw_enable_srl [p] <= PreRwEnableWriteValue (arb_burst) & ((pre_act_enable_srl [p] << 1) | 1'b1); - else if (arb_read && (arb_ba == p)) - pre_rw_enable_srl [p] <= PreRwEnableReadValue (arb_burst) & ((pre_act_enable_srl [p] << 1) | 1'b1); - else - pre_rw_enable_srl [p] <= (pre_rw_enable_srl [p] << 1) | 1'b1; - end - - end - - assign pre_enable [p] = pre_rw_enable_srl [p] [cPreRwEnableLength-1] ; - - end - - endgenerate - - //-------------------------------------------------------------------------------------------------- - // pre_all_enable has same logic as pre enable. - // pre_all_enable == &(pre_enable), but for increase performance it have own control registers - //-------------------------------------------------------------------------------------------------- - - pre_act_enable_srl_t pre_all_act_enable_srl ; - pre_rw_enable_srl_t pre_all_rw_enable_srl ; - - wire pre_all_enable; - - always_ff @(posedge clk or posedge reset) begin : pre_all_enable_shift_register - - if (reset) - pre_all_act_enable_srl <= cPreActEnableInitValue; - else if (sclr) - pre_all_act_enable_srl <= cPreActEnableInitValue; - else begin - if (arb_act) - pre_all_act_enable_srl <= cPreActEnableActValue; - else - pre_all_act_enable_srl <= (pre_all_act_enable_srl << 1) | 1'b1; - end - - - if (reset) - pre_all_rw_enable_srl <= cPreRwEnableInitValue; - else if (sclr) - pre_all_rw_enable_srl <= cPreRwEnableInitValue; - else begin - if (arb_write) - pre_all_rw_enable_srl <= PreRwEnableWriteValue (arb_burst) & ((pre_all_act_enable_srl << 1) | 1'b1); - else if (arb_read) - pre_all_rw_enable_srl <= PreRwEnableReadValue (arb_burst) & ((pre_all_act_enable_srl << 1) | 1'b1); - else - pre_all_rw_enable_srl <= (pre_all_rw_enable_srl << 1) | 1'b1; - end - - end - - assign pre_all_enable = pre_all_rw_enable_srl [cPreRwEnableLength-1]; - - //-------------------------------------------------------------------------------------------------- - // tread 4/5/6 : Trfc (refr -> act) & Trc (act -> act) & Trrd (act a -> act b) - // Trc don't need to be contolled, becouse Trc = Tras + Trcd - // Trfc & Trrd control via one register becouse refr -> any act has locked & sequental access. - // for Trc we can use 1 register, becouse act a -> act a is imposible sequence - //-------------------------------------------------------------------------------------------------- - - localparam int cActEnableLength = max (cTrfc_m1, cTrrd_m1); - - typedef logic [cActEnableLength-1:0] act_enable_srl_t; - - // to act load patterns - localparam act_enable_srl_t cActEnableInitValue = {cActEnableLength{1'b1}}; - localparam act_enable_srl_t cActEnableRefrValue = PercentRelation(cTrfc_m1, cActEnableLength); - localparam act_enable_srl_t cActEnableActValue = PercentRelation(cTrrd_m1, cActEnableLength); - - act_enable_srl_t act_enable_srl ; - - wire [0:3] act_enable ; - - always_ff @(posedge clk or posedge reset) begin : act_enable_shift_register - - if (reset) - act_enable_srl <= cActEnableInitValue; - else if (sclr) - act_enable_srl <= cActEnableInitValue; - else begin - - if (arb_refr) - act_enable_srl <= cActEnableRefrValue; - else if (arb_act) - act_enable_srl <= cActEnableActValue; - else - act_enable_srl <= (act_enable_srl << 1) | 1'b1; - - end - end - - assign act_enable = {4{act_enable_srl [cActEnableLength-1]}} ; - - //-------------------------------------------------------------------------------------------------- - // tread 8/9 : Burst (write -> write) & Burst + CL + BTA (read -> write). - // control via one register becouse write/read -> write is atomic sequental access. - //-------------------------------------------------------------------------------------------------- - - localparam int cWriteEnableLength = max (cSdramBL_m1, cSdramBL_m1 + pCL + pBTA); - - typedef logic [cWriteEnableLength-1:0] write_enable_srl_t; - - // to write load patterns - localparam write_enable_srl_t cWriteEnableInitValue = {cWriteEnableLength{1'b1}}; - - // Remember : burst already has -1 offset (!!!!) - function automatic write_enable_srl_t WriteEnableWriteValue (input sdram_burst_t burst); - WriteEnableWriteValue = PercentRelation(burst, cWriteEnableLength); - endfunction - - function automatic write_enable_srl_t WriteEnableReadValue (input sdram_burst_t burst); - WriteEnableReadValue = PercentRelation(burst + pCL + pBTA, cWriteEnableLength); - endfunction - - write_enable_srl_t write_enable_srl; - - wire [0:3] write_enable ; - - always_ff @(posedge clk or posedge reset) begin : write_enable_shift_register - - if (reset) - write_enable_srl <= cWriteEnableInitValue; - else if (sclr) - write_enable_srl <= cWriteEnableInitValue; - else begin - if (arb_write) - write_enable_srl <= WriteEnableWriteValue (arb_burst); - else if (arb_read) - write_enable_srl <= WriteEnableReadValue (arb_burst); - else - write_enable_srl <= (write_enable_srl << 1) | 1'b1; - end - end - - assign write_enable = {4{write_enable_srl [cWriteEnableLength-1]}}; - - //-------------------------------------------------------------------------------------------------- - // tread 11/12 : Burst + BTA (write -> read) & Burst (read -> read). - // contorl via one register becouse write/read -> read is atomic sequental access - // BTA from write -> read is not need !!! becouse read have read latency !!!! - //-------------------------------------------------------------------------------------------------- - - localparam int cReadEnableLength = max(cSdramBL_m1, cSdramBL_m1); - - typedef logic [cReadEnableLength-1:0] read_enable_srl_t; - - // to read load patterns - localparam read_enable_srl_t cReadEnableInitValue = {cReadEnableLength{1'b1}}; - // Remember : burst already has -1 offset (!!!!) - function automatic read_enable_srl_t ReadEnableWriteValue (input sdram_burst_t burst); - ReadEnableWriteValue = PercentRelation(burst, cReadEnableLength); - endfunction - - function automatic read_enable_srl_t ReadEnableReadValue (input sdram_burst_t burst); - ReadEnableReadValue = PercentRelation(burst, cReadEnableLength); - endfunction - - read_enable_srl_t read_enable_srl; - - wire [0:3] read_enable ; - - always_ff @(posedge clk or posedge reset) begin : read_enable_shift_register - - if (reset) - read_enable_srl <= cReadEnableInitValue; - else if (sclr) - read_enable_srl <= cReadEnableInitValue; - else begin - if (arb_write) - read_enable_srl <= ReadEnableWriteValue (arb_burst); - else if (arb_read) - read_enable_srl <= ReadEnableReadValue (arb_burst); - else - read_enable_srl <= (read_enable_srl << 1) | 1'b1; - end - - end - - assign read_enable = {4{read_enable_srl [cReadEnableLength-1]}}; - - //-------------------------------------------------------------------------------------------------- - // tread 13/14 : Trp (pre_all -> refr) & Trfc (refr -> refr). - // contol via one register becouse pre_all/refr has locked access & (pre_all -> refr) has sequental access - //-------------------------------------------------------------------------------------------------- - - localparam int cRefrEnableLength = max (cTrp_m1, cTrfc_m1); - - typedef logic [cRefrEnableLength-1:0] refr_enable_srl_t; - - // to refr load patterns - localparam refr_enable_srl_t cRefrEnableInitValue = {cRefrEnableLength{1'b1}}; - localparam refr_enable_srl_t cRefrEnablePreAllValue = PercentRelation( cTrp_m1, cRefrEnableLength); - localparam refr_enable_srl_t cRefrEnableRefrValue = PercentRelation(cTrfc_m1, cRefrEnableLength); - - refr_enable_srl_t refr_enable_srl; - - wire refr_enable; - - always_ff @(posedge clk or posedge reset) begin : refr_enable_shift_register - - if (reset) - refr_enable_srl <= cRefrEnableInitValue; - else if (sclr) - refr_enable_srl <= cRefrEnableInitValue; - else begin - if (arb_pre_all) - refr_enable_srl <= cRefrEnablePreAllValue; - else if (arb_refr) - refr_enable_srl <= cRefrEnableRefrValue; - else - refr_enable_srl <= (refr_enable_srl << 1) | 1'b1; - end - - end - - assign refr_enable = refr_enable_srl [cRefrEnableLength-1]; - - //-------------------------------------------------------------------------------------------------- - // output mapping - //-------------------------------------------------------------------------------------------------- - - assign am_pre_all_enable = pre_all_enable; - assign am_refr_enable = refr_enable; - assign am_act_enable = act_enable; - assign am_pre_enable = pre_enable; - assign am_write_enable = write_enable; - assign am_read_enable = read_enable; - - //-------------------------------------------------------------------------------------------------- - // function to generate 'b{{{data}1'b0}, {{length-data}{1'b1}}} shift register load pattern - //-------------------------------------------------------------------------------------------------- - - function automatic int unsigned PercentRelation (input int unsigned data, length); - int unsigned value; - int i; - int ones_num; - - value = 0; - ones_num = length - data; // number of ones from lsb in constant vector - for ( i = 0; i < length; i++) begin - if (i < ones_num) value[i] = 1'b1; - else value[i] = 1'b0; - end - - return value; - endfunction - - -endmodule -
trunk/rtl/hssdrc_access_manager.v Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/rtl/hssdrc_refr_counter.v =================================================================== --- trunk/rtl/hssdrc_refr_counter.v (revision 2) +++ trunk/rtl/hssdrc_refr_counter.v (nonexistent) @@ -1,131 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:52:43 $ -// -// Workfile : hssdrc_refr_counter.v -// -// Description : refresh time decode, counter based fsm -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -`include "hssdrc_timescale.vh" - -`include "hssdrc_timing.vh" -`include "hssdrc_define.vh" - -module hssdrc_refr_counter ( - clk , - reset , - sclr , - ack , - hi_req , - low_req - ); - - input wire clk ; - input wire reset ; - input wire sclr ; - - input wire ack ; - output logic hi_req ; - output logic low_req ; - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - localparam cCntWidth = clogb2(cRefCounterMaxTime); - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - logic [cCntWidth-1 : 0] cnt; - - // - // - // - - always_ff @(posedge clk or posedge reset) begin : refresh_interval_counter - if (reset) - cnt <= '0; - else if (sclr | ack) - cnt <= '0; - else - cnt <= cnt + 1'b1; - end - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - -`ifdef HSSDRC_REFR_LOW_DISABLE - - assign low_req = 1'b0; - -`else - - always_ff @(posedge clk or posedge reset) begin : low_priopity_refresh_request_set - if (reset) - low_req <= 1'b0; - else if (sclr | ack) - low_req <= 1'b0; - else if (cnt > cRefrWindowLowPriorityTime) - low_req <= 1'b1; - end - -`endif - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - -`ifdef HSSDRC_REFR_HI_DISABLE - - assign hi_req = 1'b0; - -`else - - always_ff @(posedge clk or posedge reset) begin : high_priority_refresh_request_set - if (reset) - hi_req <= 1'b0; - else if (sclr | ack) - hi_req <= 1'b0; - else if (cnt > cRefrWindowHighPriorityTime) - hi_req <= 1'b1; - end - -`endif - - // - // - // -endmodule
trunk/rtl/hssdrc_refr_counter.v Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/rtl/hssdrc_arbiter_in.v =================================================================== --- trunk/rtl/hssdrc_arbiter_in.v (revision 2) +++ trunk/rtl/hssdrc_arbiter_in.v (nonexistent) @@ -1,255 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:52:43 $ -// -// Workfile : hssdrc_arbiter_in.v -// -// Description : input 3 way decode arbiter -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - - -`include "hssdrc_timescale.vh" - -`include "hssdrc_define.vh" - -module hssdrc_arbiter_in ( - clk , - reset , - sclr , - // - sys_write , - sys_read , - sys_refr , - sys_rowa , - sys_cola , - sys_ba , - sys_burst , - sys_chid_i , - sys_ready , - // - refr_cnt_ack , - refr_cnt_hi_req , - refr_cnt_low_req , - // - dec0_write , - dec0_read , - dec0_refr , - dec0_rowa , - dec0_cola , - dec0_ba , - dec0_burst , - dec0_chid , - dec0_ready , - // - dec1_write , - dec1_read , - dec1_refr , - dec1_rowa , - dec1_cola , - dec1_ba , - dec1_burst , - dec1_chid , - dec1_ready , - // - dec2_write , - dec2_read , - dec2_refr , - dec2_rowa , - dec2_cola , - dec2_ba , - dec2_burst , - dec2_chid , - dec2_ready - ); - - input wire clk ; - input wire reset ; - input wire sclr ; - - //-------------------------------------------------------------------------------------------------- - // interface from refresh cycle generator - //-------------------------------------------------------------------------------------------------- - - output logic refr_cnt_ack ; - input wire refr_cnt_hi_req ; - input wire refr_cnt_low_req ; - - //-------------------------------------------------------------------------------------------------- - // interface from system - //-------------------------------------------------------------------------------------------------- - - input wire sys_write ; - input wire sys_read ; - input wire sys_refr ; - input rowa_t sys_rowa ; - input cola_t sys_cola ; - input ba_t sys_ba ; - input burst_t sys_burst ; - input chid_t sys_chid_i ; - output logic sys_ready ; - - //-------------------------------------------------------------------------------------------------- - // interface to sdram sequence decoders - //-------------------------------------------------------------------------------------------------- - - output logic dec0_write ; - output logic dec0_read ; - output logic dec0_refr ; - output rowa_t dec0_rowa ; - output cola_t dec0_cola ; - output ba_t dec0_ba ; - output burst_t dec0_burst ; - output chid_t dec0_chid ; - input wire dec0_ready ; - // - output logic dec1_write ; - output logic dec1_read ; - output logic dec1_refr ; - output rowa_t dec1_rowa ; - output cola_t dec1_cola ; - output ba_t dec1_ba ; - output burst_t dec1_burst ; - output chid_t dec1_chid ; - input wire dec1_ready ; - // - output logic dec2_write ; - output logic dec2_read ; - output logic dec2_refr ; - output rowa_t dec2_rowa ; - output cola_t dec2_cola ; - output ba_t dec2_ba ; - output burst_t dec2_burst ; - output chid_t dec2_chid ; - input wire dec2_ready ; - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - wire sys_lock ; - wire low_req_lock ; - wire arb_write ; - wire arb_read ; - wire arb_refr ; - wire arb_ready ; - wire arb_ack ; - wire arb_refr_ack ; - logic [2:0] arb; - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - assign sys_lock = refr_cnt_hi_req; - assign low_req_lock = sys_write | sys_read | sys_refr; - - // - // - // - - assign arb_write = sys_write & ~sys_lock; - assign arb_read = sys_read & ~sys_lock; - assign arb_refr = sys_refr | refr_cnt_hi_req | (refr_cnt_low_req & ~low_req_lock); - assign arb_ready = dec0_ready | dec1_ready | dec2_ready; - - // - // - // - - assign arb_ack = arb_ready & (arb_write | arb_read | arb_refr); - assign arb_refr_ack = arb_ready & arb_refr ; - - // - // - // - - assign refr_cnt_ack = arb_refr_ack; - - // - // - // - - assign sys_ready = arb_ready & ~sys_lock; - - // - // - // - - always_ff @(posedge clk or posedge reset) begin : arbiter_logic - if (reset) - arb <= 3'b001; - else if (sclr) - arb <= 3'b001; - else if (arb_ack) - arb <= {arb[1:0], arb[2]}; - end - - // - // - // - - assign dec0_write = arb_write & arb[0]; - assign dec0_read = arb_read & arb[0]; - assign dec0_refr = arb_refr & arb[0]; - assign dec0_rowa = sys_rowa ; - assign dec0_cola = sys_cola ; - assign dec0_ba = sys_ba ; - assign dec0_burst = sys_burst ; - assign dec0_chid = sys_chid_i; - - // - // - // - - assign dec1_write = arb_write & arb[1]; - assign dec1_read = arb_read & arb[1]; - assign dec1_refr = arb_refr & arb[1]; - assign dec1_rowa = sys_rowa ; - assign dec1_cola = sys_cola ; - assign dec1_ba = sys_ba ; - assign dec1_burst = sys_burst ; - assign dec1_chid = sys_chid_i; - - // - // - // - - assign dec2_write = arb_write & arb[2]; - assign dec2_read = arb_read & arb[2]; - assign dec2_refr = arb_refr & arb[2]; - assign dec2_rowa = sys_rowa ; - assign dec2_cola = sys_cola ; - assign dec2_ba = sys_ba ; - assign dec2_burst = sys_burst ; - assign dec2_chid = sys_chid_i; - -endmodule
trunk/rtl/hssdrc_arbiter_in.v Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/rtl/hssdrc_arbiter_out.v =================================================================== --- trunk/rtl/hssdrc_arbiter_out.v (revision 2) +++ trunk/rtl/hssdrc_arbiter_out.v (nonexistent) @@ -1,631 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:52:43 $ -// -// Workfile : hssdrc_arbiter_out.v -// -// Description : output 3 way decode arbiter -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -`include "hssdrc_timescale.vh" - -`include "hssdrc_define.vh" - -module hssdrc_arbiter_out ( - clk , - reset , - sclr , - // - dec0_pre_all , - dec0_refr , - dec0_pre , - dec0_act , - dec0_read , - dec0_write , - dec0_pre_all_enable, - dec0_refr_enable , - dec0_pre_enable , - dec0_act_enable , - dec0_read_enable , - dec0_write_enable , - dec0_locked , - dec0_last , - dec0_rowa , - dec0_cola , - dec0_ba , - dec0_chid , - dec0_burst , - // - dec1_pre_all , - dec1_refr , - dec1_pre , - dec1_act , - dec1_read , - dec1_write , - dec1_pre_all_enable, - dec1_refr_enable , - dec1_pre_enable , - dec1_act_enable , - dec1_read_enable , - dec1_write_enable , - dec1_locked , - dec1_last , - dec1_rowa , - dec1_cola , - dec1_ba , - dec1_chid , - dec1_burst , - // - dec2_pre_all , - dec2_refr , - dec2_pre , - dec2_act , - dec2_read , - dec2_write , - dec2_pre_all_enable, - dec2_refr_enable , - dec2_pre_enable , - dec2_act_enable , - dec2_read_enable , - dec2_write_enable , - dec2_locked , - dec2_last , - dec2_rowa , - dec2_cola , - dec2_ba , - dec2_chid , - dec2_burst , - // - am_pre_all_enable , - am_refr_enable , - am_pre_enable , - am_act_enable , - am_read_enable , - am_write_enable , - // - arb_pre_all , - arb_refr , - arb_pre , - arb_act , - arb_read , - arb_write , - arb_rowa , - arb_cola , - arb_ba , - arb_chid , - arb_burst - ); - - input wire clk ; - input wire reset; - input wire sclr ; - - //-------------------------------------------------------------------------------------------------- - // interface from sequence decoders - //-------------------------------------------------------------------------------------------------- - - input wire dec0_pre_all ; - input wire dec0_refr ; - input wire dec0_pre ; - input wire dec0_act ; - input wire dec0_read ; - input wire dec0_write ; - output logic dec0_pre_all_enable; - output logic dec0_refr_enable ; - output logic dec0_pre_enable ; - output logic dec0_act_enable ; - output logic dec0_read_enable ; - output logic dec0_write_enable ; - input wire dec0_locked ; - input wire dec0_last ; - input rowa_t dec0_rowa ; - input cola_t dec0_cola ; - input ba_t dec0_ba ; - input chid_t dec0_chid ; - input sdram_burst_t dec0_burst ; - // - input wire dec1_pre_all ; - input wire dec1_refr ; - input wire dec1_pre ; - input wire dec1_act ; - input wire dec1_read ; - input wire dec1_write ; - output logic dec1_pre_all_enable; - output logic dec1_refr_enable ; - output logic dec1_pre_enable ; - output logic dec1_act_enable ; - output logic dec1_read_enable ; - output logic dec1_write_enable ; - input wire dec1_locked ; - input wire dec1_last ; - input rowa_t dec1_rowa ; - input cola_t dec1_cola ; - input ba_t dec1_ba ; - input chid_t dec1_chid ; - input sdram_burst_t dec1_burst ; - // - input wire dec2_pre_all ; - input wire dec2_refr ; - input wire dec2_pre ; - input wire dec2_act ; - input wire dec2_read ; - input wire dec2_write ; - output logic dec2_pre_all_enable; - output logic dec2_refr_enable ; - output logic dec2_pre_enable ; - output logic dec2_act_enable ; - output logic dec2_read_enable ; - output logic dec2_write_enable ; - input wire dec2_locked ; - input wire dec2_last ; - input rowa_t dec2_rowa ; - input cola_t dec2_cola ; - input ba_t dec2_ba ; - input chid_t dec2_chid ; - input sdram_burst_t dec2_burst ; - - //-------------------------------------------------------------------------------------------------- - // interface from access manager - //-------------------------------------------------------------------------------------------------- - - input wire am_pre_all_enable ; - input wire am_refr_enable ; - input wire [0:3] am_pre_enable ; - input wire [0:3] am_act_enable ; - input wire [0:3] am_read_enable ; - input wire [0:3] am_write_enable ; - - //-------------------------------------------------------------------------------------------------- - // interface to multiplexer - //-------------------------------------------------------------------------------------------------- - - output logic arb_pre_all ; - output logic arb_refr ; - output logic arb_pre ; - output logic arb_act ; - output logic arb_read ; - output logic arb_write ; - output rowa_t arb_rowa ; - output cola_t arb_cola ; - output ba_t arb_ba ; - output chid_t arb_chid ; - output sdram_burst_t arb_burst ; - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - enum bit [1:0] {ARB0, ARB1, ARB2} arb, ba_rowa_mux; - - logic arb_ack; - - logic dec0_access_enable; - logic dec1_access_enable; - logic dec2_access_enable; - - logic dec0_bank_access_enable; - logic dec1_bank_access_enable; - logic dec2_bank_access_enable; - - logic dec1_can_have_access_when_arb_is_0 ; - logic dec2_can_have_access_when_arb_is_0 ; - - logic dec2_can_have_access_when_arb_is_1 ; - logic dec0_can_have_access_when_arb_is_1 ; - - logic dec0_can_have_access_when_arb_is_2 ; - logic dec1_can_have_access_when_arb_is_2 ; - - logic dec0_access_done; - logic dec1_access_done; - logic dec2_access_done; - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - always_ff @(posedge clk or posedge reset) begin : arbiter_logic - if (reset) - arb <= ARB0; - else if (sclr) - arb <= ARB0; - else if (arb_ack) - unique case (arb) - ARB0 : arb <= ARB1; - ARB1 : arb <= ARB2; - ARB2 : arb <= ARB0; - endcase - end - - // - // - // - `ifndef HSSDRC_NOT_SHARE_ACT_COMMAND - // use act command sharing - assign dec0_bank_access_enable = (dec0_pre & am_pre_enable [dec0_ba] ) | - (dec0_act & am_act_enable [dec0_ba] ) ; - - assign dec1_bank_access_enable = (dec1_pre & am_pre_enable [dec1_ba] ) | - (dec1_act & am_act_enable [dec1_ba] ) ; - - assign dec2_bank_access_enable = (dec2_pre & am_pre_enable [dec2_ba] ) | - (dec2_act & am_act_enable [dec2_ba] ) ; - `else - // not use act command sharing - assign dec0_bank_access_enable = (dec0_pre & am_pre_enable [dec0_ba] ) ; - - assign dec1_bank_access_enable = (dec1_pre & am_pre_enable [dec1_ba] ) ; - - assign dec2_bank_access_enable = (dec2_pre & am_pre_enable [dec2_ba] ) ; - `endif - // - // - // - assign dec0_access_enable = (dec0_read & am_read_enable [dec0_ba] ) | - (dec0_write & am_write_enable [dec0_ba] ) | - (dec0_pre & am_pre_enable [dec0_ba] ) | - (dec0_act & am_act_enable [dec0_ba] ) ; - - assign dec1_access_enable = (dec1_read & am_read_enable [dec1_ba] ) | - (dec1_write & am_write_enable [dec1_ba] ) | - (dec1_pre & am_pre_enable [dec1_ba] ) | - (dec1_act & am_act_enable [dec1_ba] ) ; - - - assign dec2_access_enable = (dec2_read & am_read_enable [dec2_ba] ) | - (dec2_write & am_write_enable [dec2_ba] ) | - (dec2_pre & am_pre_enable [dec2_ba] ) | - (dec2_act & am_act_enable [dec2_ba] ) ; - // - // - // - assign dec0_access_done = (dec0_refr & dec0_refr_enable) | - (dec0_last & - ((dec0_read & dec0_read_enable ) | - ( dec0_write & dec0_write_enable )) - ); - - assign dec1_access_done = (dec1_refr & dec1_refr_enable) | - (dec1_last & - ((dec1_read & dec1_read_enable ) | - ( dec1_write & dec1_write_enable )) - ); - - assign dec2_access_done = (dec2_refr & dec2_refr_enable) | - (dec2_last & - ((dec2_read & dec2_read_enable ) | - ( dec2_write & dec2_write_enable )) - ); - // - // - // - assign arb_ack = (dec0_access_done && (arb == ARB0)) | - (dec1_access_done && (arb == ARB1)) | - (dec2_access_done && (arb == ARB2)); - //-------------------------------------------------------------------------------------------------- - // decoder roundabout : dec0 -> dec1 -> dec2 -> dec0 -> dec1 - // - // arbiter for command pipeline need in folow comparators : - // 0 : dec0 - dec1 -> select dec1 - // : dec0 - dec2 & dec1 - dec2 -> select dec2 - // 1 : dec1 - dec2 -> select dec2 - // : dec1 - dec2 & dec2 - dec0 -> select dec0 - // 2 : dec2 - dec0 -> select dec0 - // : dec2 - dec1 & dec0 - dec1 -> select dec1 - // we can reclock it. becouse "ba" and "locked" is valid 1 tick before command - //-------------------------------------------------------------------------------------------------- - - always_ff @(posedge clk) begin : locked_and_bank_access_comparator - dec1_can_have_access_when_arb_is_0 <= ~dec0_locked & (dec1_ba != dec0_ba); - dec2_can_have_access_when_arb_is_0 <= ~dec0_locked & (dec2_ba != dec0_ba) & ~dec1_locked & (dec2_ba != dec1_ba); - - dec2_can_have_access_when_arb_is_1 <= ~dec1_locked & (dec2_ba != dec1_ba); - dec0_can_have_access_when_arb_is_1 <= ~dec1_locked & (dec0_ba != dec1_ba) & ~dec2_locked & (dec0_ba != dec2_ba); - - dec0_can_have_access_when_arb_is_2 <= ~dec2_locked & (dec0_ba != dec2_ba); - dec1_can_have_access_when_arb_is_2 <= ~dec2_locked & (dec1_ba != dec2_ba) & ~dec0_locked & (dec1_ba != dec0_ba); - end - - // - // - // - - always_comb begin : control_path_arbiter - - dec0_pre_all_enable = 1'b0; - dec0_refr_enable = 1'b0; - dec0_pre_enable = 1'b0; - dec0_act_enable = 1'b0; - dec0_read_enable = 1'b0; - dec0_write_enable = 1'b0; - - dec1_pre_all_enable = 1'b0; - dec1_refr_enable = 1'b0; - dec1_pre_enable = 1'b0; - dec1_act_enable = 1'b0; - dec1_read_enable = 1'b0; - dec1_write_enable = 1'b0; - - dec2_pre_all_enable = 1'b0; - dec2_refr_enable = 1'b0; - dec2_pre_enable = 1'b0; - dec2_act_enable = 1'b0; - dec2_read_enable = 1'b0; - dec2_write_enable = 1'b0; - - arb_pre_all = 1'b0; - arb_refr = 1'b0; - arb_pre = 1'b0; - arb_act = 1'b0; - arb_read = 1'b0; - arb_write = 1'b0; - - ba_rowa_mux = arb; - - unique case (arb) - ARB0 : begin : dec0_is_master - - dec0_pre_all_enable = am_pre_all_enable ; - dec0_refr_enable = am_refr_enable ; - dec0_pre_enable = am_pre_enable [dec0_ba]; - dec0_act_enable = am_act_enable [dec0_ba]; - dec0_read_enable = am_read_enable [dec0_ba]; - dec0_write_enable = am_write_enable [dec0_ba]; - - arb_pre_all = dec0_pre_all & dec0_pre_all_enable ; - arb_refr = dec0_refr & dec0_refr_enable ; - arb_pre = dec0_pre & dec0_pre_enable ; - arb_act = dec0_act & dec0_act_enable ; - arb_read = dec0_read & dec0_read_enable ; - arb_write = dec0_write & dec0_write_enable ; - -`ifndef HSSDRC_SHARE_NONE_DECODER - - if (~dec0_access_enable) begin - - if (dec1_can_have_access_when_arb_is_0) begin - - ba_rowa_mux = ARB1; - // - dec1_pre_enable = am_pre_enable [dec1_ba]; - - arb_pre = dec1_pre & dec1_pre_enable ; - // - `ifndef HSSDRC_NOT_SHARE_ACT_COMMAND - dec1_act_enable = am_act_enable [dec1_ba]; - - arb_act = dec1_act & dec1_act_enable ; - `endif - - end - - `ifndef HSSDRC_SHARE_ONE_DECODER - if (~dec1_bank_access_enable & dec2_can_have_access_when_arb_is_0) begin - `else - else if (dec2_can_have_access_when_arb_is_0) begin - `endif - ba_rowa_mux = ARB2; - // - dec2_pre_enable = am_pre_enable [dec2_ba]; - - arb_pre = dec2_pre & dec2_pre_enable ; - // - `ifndef HSSDRC_NOT_SHARE_ACT_COMMAND - dec2_act_enable = am_act_enable [dec2_ba]; - - arb_act = dec2_act & dec2_act_enable ; - `endif - - end - end -`endif // HSSDRC_SHARE_NONE_DECODER - end - - ARB1 : begin : dec1_is_master - - dec1_pre_all_enable = am_pre_all_enable ; - dec1_refr_enable = am_refr_enable ; - dec1_pre_enable = am_pre_enable [dec1_ba]; - dec1_act_enable = am_act_enable [dec1_ba]; - dec1_read_enable = am_read_enable [dec1_ba]; - dec1_write_enable = am_write_enable [dec1_ba]; - - arb_pre_all = dec1_pre_all & dec1_pre_all_enable ; - arb_refr = dec1_refr & dec1_refr_enable ; - arb_pre = dec1_pre & dec1_pre_enable ; - arb_act = dec1_act & dec1_act_enable ; - arb_read = dec1_read & dec1_read_enable ; - arb_write = dec1_write & dec1_write_enable ; - -`ifndef HSSDRC_SHARE_NONE_DECODER - - if (~dec1_access_enable) begin - - if (dec2_can_have_access_when_arb_is_1) begin - - ba_rowa_mux = ARB2; - // - dec2_pre_enable = am_pre_enable [dec2_ba]; - - arb_pre = dec2_pre & dec2_pre_enable ; - // - `ifndef HSSDRC_NOT_SHARE_ACT_COMMAND - dec2_act_enable = am_act_enable [dec2_ba]; - - arb_act = dec2_act & dec2_act_enable ; - `endif - - end - - `ifndef HSSDRC_SHARE_ONE_DECODER - if (~dec2_bank_access_enable & dec0_can_have_access_when_arb_is_1) begin - `else - else if (dec0_can_have_access_when_arb_is_1) begin - `endif - ba_rowa_mux = ARB0; - // - dec0_pre_enable = am_pre_enable [dec0_ba]; - - arb_pre = dec0_pre & dec0_pre_enable ; - // - `ifndef HSSDRC_NOT_SHARE_ACT_COMMAND - dec0_act_enable = am_act_enable [dec0_ba]; - - arb_act = dec0_act & dec0_act_enable ; - `endif - - end - end -`endif // HSSDRC_SHARE_NONE_DECODER - end - - ARB2 : begin : dec2_is_master - - dec2_pre_all_enable = am_pre_all_enable ; - dec2_refr_enable = am_refr_enable ; - dec2_pre_enable = am_pre_enable [dec2_ba] ; - dec2_act_enable = am_act_enable [dec2_ba] ; - dec2_read_enable = am_read_enable [dec2_ba] ; - dec2_write_enable = am_write_enable [dec2_ba] ; - - arb_pre_all = dec2_pre_all & dec2_pre_all_enable ; - arb_refr = dec2_refr & dec2_refr_enable ; - arb_pre = dec2_pre & dec2_pre_enable ; - arb_act = dec2_act & dec2_act_enable ; - arb_read = dec2_read & dec2_read_enable ; - arb_write = dec2_write & dec2_write_enable ; - -`ifndef HSSDRC_SHARE_NONE_DECODER - - if (~dec2_access_enable) begin - - if (dec0_can_have_access_when_arb_is_2) begin - - ba_rowa_mux = ARB0; - // - dec0_pre_enable = am_pre_enable [dec0_ba]; - - arb_pre = dec0_pre & dec0_pre_enable ; - // - `ifndef HSSDRC_NOT_SHARE_ACT_COMMAND - dec0_act_enable = am_act_enable [dec0_ba]; - - arb_act = dec0_act & dec0_act_enable ; - `endif - - end - - `ifndef HSSDRC_SHARE_ONE_DECODER - if (~dec0_bank_access_enable & dec1_can_have_access_when_arb_is_2) begin - `else - else if (dec1_can_have_access_when_arb_is_2) begin - `endif - ba_rowa_mux = ARB1; - // - dec1_pre_enable = am_pre_enable [dec1_ba]; - - arb_pre = dec1_pre & dec1_pre_enable ; - // - `ifndef HSSDRC_NOT_SHARE_ACT_COMMAND - dec1_act_enable = am_act_enable [dec1_ba]; - - arb_act = dec1_act & dec1_act_enable ; - `endif - - end - end -`endif // HSSDRC_SHARE_NONE_DECODER - end - endcase - end - - - - always_comb begin : mux_addr_path2arbiter - - // - // no complex mux : used in read/write command - // - - arb_cola = dec0_cola; - arb_chid = dec0_chid; - arb_burst = dec0_burst; - - unique case (arb) - ARB0 : begin - arb_cola = dec0_cola; - arb_chid = dec0_chid; - arb_burst = dec0_burst; - end - ARB1 : begin - arb_cola = dec1_cola; - arb_chid = dec1_chid; - arb_burst = dec1_burst; - end - ARB2 : begin - arb_cola = dec2_cola; - arb_chid = dec2_chid; - arb_burst = dec2_burst; - end - default : begin end - endcase - - // - // complex mux used in pre command - // - - arb_ba = dec0_ba; - - unique case (ba_rowa_mux) - ARB0 : arb_ba = dec0_ba; - ARB1 : arb_ba = dec1_ba; - ARB2 : arb_ba = dec2_ba; - endcase - - // - // complex mux used in act command - // - - arb_rowa = dec0_rowa; - -`ifndef HSSDRC_NOT_SHARE_ACT_COMMAND - unique case (ba_rowa_mux) -`else - unique case (arb) -`endif - ARB0 : arb_rowa = dec0_rowa; - ARB1 : arb_rowa = dec1_rowa; - ARB2 : arb_rowa = dec2_rowa; - endcase - - end - -endmodule
trunk/rtl/hssdrc_arbiter_out.v Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/rtl/hssdrc_ba_map.v =================================================================== --- trunk/rtl/hssdrc_ba_map.v (revision 2) +++ trunk/rtl/hssdrc_ba_map.v (nonexistent) @@ -1,136 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:52:43 $ -// -// Workfile : hssdrc_ba_map.v -// -// Description : bank & row map unit -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - - -`include "hssdrc_timescale.vh" - -`include "hssdrc_define.vh" - -module hssdrc_ba_map ( - clk , - reset , - sclr , - // - update , - clear , - ba , - rowa , - // - pre_act_rw , - act_rw , - rw , - all_close - - ); - - input wire clk ; - input wire reset ; - input wire sclr ; - - //-------------------------------------------------------------------------------------------------- - // interface from sequence decoders - //-------------------------------------------------------------------------------------------------- - - input wire update ; - input wire clear ; - input ba_t ba ; - input rowa_t rowa ; - - //-------------------------------------------------------------------------------------------------- - // interface to sequence decoders - //-------------------------------------------------------------------------------------------------- - - output logic pre_act_rw ; - output logic act_rw ; - output logic rw ; - output logic all_close ; - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - logic [3:0] bank_open; - rowa_t row_open [0:3]; - wire bank_is_open; - wire row_is_open; - - //-------------------------------------------------------------------------------------------------- - // - //-------------------------------------------------------------------------------------------------- - - always_ff @(posedge clk or posedge reset) begin : bank_open_map_process - if (reset) - bank_open <= '0; - else if (sclr) - bank_open <= '0; - else begin - if (clear) - bank_open <= '0; - else if (update) - bank_open [ba] <= 1'b1; - else begin - end - end - end - - // - // - // - - always_ff @(posedge clk) begin : row_open_map_process - if (update) - row_open[ba] <= rowa; - end - - // - // - // - - assign bank_is_open = bank_open [ba]; - assign row_is_open = (row_open [ba] == rowa); - - // - // - // - - assign rw = bank_is_open & row_is_open; - assign pre_act_rw = bank_is_open & ~row_is_open; - assign act_rw = ~bank_is_open; - assign all_close = (bank_open == 0); - -endmodule
trunk/rtl/hssdrc_ba_map.v Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/include/hssdrc_timescale.vh =================================================================== --- trunk/include/hssdrc_timescale.vh (revision 2) +++ trunk/include/hssdrc_timescale.vh (nonexistent) @@ -1,44 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:51:55 $ -// -// Workfile : hssdrc_timescale.vh -// -// Description : simulation time settings -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -// synthesis translate_off - - timeunit 1ns; - timeprecision 10ps; - -// synthesis translate_on
trunk/include/hssdrc_timescale.vh Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/include/hssdrc_timing.vh =================================================================== --- trunk/include/hssdrc_timing.vh (revision 2) +++ trunk/include/hssdrc_timing.vh (nonexistent) @@ -1,93 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:51:55 $ -// -// Workfile : hssdrc_timing.vh -// -// Description : controller sdram timing paramters -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -`ifndef __HSSDRC_TIMING_VH__ - - `define __HSSDRC_TIMING_VH__ - - //`define HSSDRC_SIMULATE_TIMING // uncomment for easy debug arefr sequence - - //------------------------------------------------- - // sdram controller clock settings in MHz - //------------------------------------------------- - parameter real pClkMHz = 133.0; - //------------------------------------------------- - // sdram chip timing paramters in "ns" for -6 CL3 - //------------------------------------------------- - parameter real pTras_time = 42.0; // act a -> prech a - parameter real pTrfc_time = 60.0; // refr -> !nop - parameter real pTrc_time = 60.0; // act a -> act a (Tras + Trcd) - parameter real pTrcd_time = 18.0; // act a -> write/read a - parameter real pTrp_time = 18.0; // prech a -> !nop - parameter real pTrrd_time = 12.0; // act a -> act b - parameter real pTwr_time = 12.0; // write a -> prech a - - `ifndef HSSDRC_SIMULATE_TIMING - parameter real pRefr_time = 15625.0; // refr -> refr - parameter real pInit_time = 100000.0; // power up -> refr - `else - parameter real pRefr_time = 500.0; // simulate only refr -> refr - parameter real pInit_time = 500.0; // simulate only power up -> refr - `endif - //------------------------------------------------- - // sdram chip normalaize to clock parameters - //------------------------------------------------- - parameter int cTras = 0.5 + (pTras_time * pClkMHz)/1000.0; // act a -> prech a - parameter int cTrfc = 0.5 + (pTrfc_time * pClkMHz)/1000.0; // refr -> !nop - parameter int cTrc = 0.5 + ( pTrc_time * pClkMHz)/1000.0; // act a -> act a - parameter int cTrcd = 0.5 + (pTrcd_time * pClkMHz)/1000.0; // act a -> write/read a - parameter int cTrp = 0.5 + ( pTrp_time * pClkMHz)/1000.0; // prech a -> !nop - parameter int cTrrd = 0.5 + (pTrrd_time * pClkMHz)/1000.0; // act a -> act b - parameter int cTwr = 0.5 + ( pTwr_time * pClkMHz)/1000.0; // write a -> prech a - parameter int cTmrd = 2; // lmr -> !nop (not used) - parameter int cInitTime = 0.5 + (pInit_time * pClkMHz)/1000.0; - //------------------------------------------------- - // refresh parameters - //------------------------------------------------- - parameter real pRefrWindowLowPriority = 0.85; - parameter real pRefrWindowHighPriority = 0.95; - parameter int cRefCounterMaxTime = 0.5 + (pRefr_time * pClkMHz)/1000.0; - parameter int cRefrWindowLowPriorityTime = 0.5 + (pRefrWindowLowPriority * pRefr_time * pClkMHz)/1000.0; - parameter int cRefrWindowHighPriorityTime = 0.5 + (pRefrWindowHighPriority * pRefr_time * pClkMHz)/1000.0; - //------------------------------------------------- - // sdram controller use 0/1 cycle bus turnaround - //------------------------------------------------- - parameter int pBTA = 1; // set 0 if not need - - // -`endif
trunk/include/hssdrc_timing.vh Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/include/hssdrc_define.vh =================================================================== --- trunk/include/hssdrc_define.vh (revision 2) +++ trunk/include/hssdrc_define.vh (nonexistent) @@ -1,139 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:51:55 $ -// -// Workfile : hssdrc_define.vh -// -// Description : controller hardware paramters & settings -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -`ifndef __HSSDRC_DEFINE_VH__ - - `define __HSSDRC_DEFINE_VH__ - - //`define HSSDRC_DQ_PIPELINE // uncomment when need dq data register output - //`define HSSDRC_REFR_HI_DISABLE // uncomment when not need high priority refresh logic - //`define HSSDRC_REFR_LOW_DISABLE // uncomment when not need low priority refresh logic - //---------------------------------------------------------------------------------- - // default : controller used use_wdata signal with register output type - // optionaly : controller can use combinative use_wdata signal which set 1 cycle early - //---------------------------------------------------------------------------------- - //`define HSSDRC_COMBINATORY_USE_WDATA // uncomment when need to use non register use_wdata signal - //---------------------------------------------------------------------------------- - // default : decoders sharing PRE & ACT command inside sdram command pipeline waiting - //---------------------------------------------------------------------------------- - //`define HSSDRC_NOT_SHARE_ACT_COMMAND // uncomment for not generate logic for share ACT command - //---------------------------------------------------------------------------------- - // default : 2 decoders sharing sdram command pipeline inside PRE & ACT command waiting - //---------------------------------------------------------------------------------- - //`define HSSDRC_SHARE_ONE_DECODER // uncoment for only 1 decoder share - //`define HSSDRC_SHARE_NONE_DECODER // uncoment for none decoder share - //---------------------------------------------------------------------------------- - // sdram controller command interface parameters - //---------------------------------------------------------------------------------- - parameter int pRowaBits = 11; // >= 11 (0..10) - parameter int pColaBits = 8; // <= pRowBits - parameter int pBaBits = 2; // fixed == 2 (don't change !!!) - parameter int pBurstBits = 4; // <= 4 - parameter int pChIdBits = 2; // >= 1 - //---------------------------------------------------------------------------------- - // sdram controller data interface & sdram chip data interface parameters - //---------------------------------------------------------------------------------- - parameter int pDataBits = 32; // >= 8 - parameter int pDatamBits = byte_lanes(pDataBits); - //---------------------------------------------------------------------------------- - // sdram controller command interface parameters - //---------------------------------------------------------------------------------- - parameter int pSdramAddrBits = 11; // (>= pRowaBits & >= 11) - parameter int pSdramBurstBits = 2; // fixed == 2 (don't change !!!) - parameter int cSdramBL = 2**pSdramBurstBits; - //---------------------------------------------------------------------------------- - // sdram controller mode parameters (don't change except CL !!!!) - //---------------------------------------------------------------------------------- - parameter bit pInitWBM = 1'b0; // write burst mode = programed burst - parameter bit [1:0] pInitOM = 1'b0; // operation mode = standart - parameter bit [2:0] pCL = 3'b011; // cas latency = 3 - parameter bit pInitBT = 1'b0; // burst type = sequental - parameter bit [2:0] pInitBL = 3'b010; // burst = 4 - - parameter bit [pSdramAddrBits-1:10] pReserved = '0; - parameter bit [pSdramAddrBits-1: 0] cInitLmrValue = {pReserved, pInitWBM, pInitOM, pCL, pInitBT, pInitBL}; - //---------------------------------------------------------------------------------- - // used types - //---------------------------------------------------------------------------------- - typedef logic [pColaBits - 1 : 0] cola_t; - typedef logic [pRowaBits - 1 : 0] rowa_t; - typedef logic [pBaBits - 1 : 0] ba_t; - typedef logic [pBurstBits - 1 : 0] burst_t; - typedef logic [pChIdBits - 1 : 0] chid_t; - typedef logic [pDataBits - 1 : 0] data_t; - typedef logic [pDatamBits - 1 : 0] datam_t; - - typedef logic [pSdramAddrBits-1 :0] sdram_addr_t; - typedef logic [pSdramBurstBits-1:0] sdram_burst_t; - //---------------------------------------------------------------------------------- - // - //---------------------------------------------------------------------------------- - function automatic int clogb2 (input int data); - int i; - - for (i = 0; 2**i < data; i++) - clogb2 = i + 1; - endfunction - //---------------------------------------------------------------------------------- - // - //---------------------------------------------------------------------------------- - function automatic int byte_lanes (input int data); - int num; - - byte_lanes = 0; - - num = data; - // synthesis translate_off - assert (num != 0) else $error ("wrong data parameter"); - // synthesis translate_on - while (num > 0) begin - byte_lanes++; - num = num - 8; - end - - endfunction - //---------------------------------------------------------------------------------- - // - //---------------------------------------------------------------------------------- - function automatic int unsigned max(input int unsigned a, b); - if (a >= b) max = a; - else max = b; - endfunction - -`endif -
trunk/include/hssdrc_define.vh Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/include/tb_define.svh =================================================================== --- trunk/include/tb_define.svh (revision 2) +++ trunk/include/tb_define.svh (nonexistent) @@ -1,157 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:51:55 $ -// -// Workfile : tb_define.svh -// -// Description : testbench types, values, parameters -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -`include "hssdrc_define.vh" - -`ifndef __TB_DEFINE_SVH__ - - `define __TB_DEFINE_SVH__ - - // - // tb types without Z, X states - // - typedef bit [pColaBits - 1 : 0] tb_cola_t; - typedef bit [pRowaBits - 1 : 0] tb_rowa_t; - typedef bit [pBaBits - 1 : 0] tb_ba_t; - typedef bit [pBurstBits - 1 : 0] tb_burst_t; - typedef bit [pChIdBits - 1 : 0] tb_chid_t; - typedef bit [pDataBits - 1 : 0] tb_data_t; - typedef bit [pDatamBits - 1 : 0] tb_datam_t; - - // - // ram test parameters for correctness test - // - - localparam int cColaMaxValue = 2**pColaBits; - localparam int cRowaMaxValue = 2**pRowaBits; - localparam int cBaMaxValue = 2**pBaBits; - localparam int cBurstMaxValue = 2**pBurstBits; - - // - // number of transactions in random correctness test - // - - localparam int cTransactionMaxValue = cColaMaxValue*cBaMaxValue*cRowaMaxValue; - - // - // time interval for bandwidth measure for each bandwidth measure mode - // - - const time cPerfomanceInterval = 200us;//10ms; - - // - // number of transaction for done log message - // - - const int cTransactionLogPeriod = 1024; - - // - // bandwidth measure modes - // - - typedef struct packed { - bit read_mode; - bit write_mode; - } test_mode_t; // used tests : 1 - write, 2 - read, 3 write -> read; - - int burst_mode [$] = '{1, 2, 3, 4, 5}; - int address_mode [$] = '{0, 1, 2, 3, 4, 5}; - test_mode_t test_mode [$] = '{1, 2, 3} ; - - const string test_mode_name [4] = '{ - 0 : "error mode", - 1 : "sequental write", - 2 : "sequental read", - 3 : "sequental write -> read" - }; - - const string burst_mode_name [7] = '{ - 0 : "burst mode : {any, no cola allign}", - 1 : "burst mode : {fixed == 1, cola allign}", - 2 : "burst mode : {fixed == 2, cola allign}", - 3 : "burst mode : {fixed == 4, cola allign}", - 4 : "burst mode : {fixed == 8, cola allign}", - 5 : "burst mode : {fixed == 16, cola allign}", - 6 : "burst mode : {any inside [1,2, 4,8,16], cola allign}" - }; - - const string address_mode_name [8] = '{ - 0 : "address mode : {same bank : same row}", - 1 : "address mode : {same bank : any row}", - 2 : "address mode : {any bank : same row}", - 3 : "address mode : {linear bank : same row}", - 4 : "address mode : {any bank : any row}", - 5 : "address mode : {linear bank : any row}", - 6 : "address mode : {any bank : any row : ba varies more often than rowa}", - 7 : "address mode : {any bank : any row : ba varies less often than rowa}" - }; - - // - // virtual transaction tread types & parameters - // - - localparam int cTreadMaxNumber = cBaMaxValue*cRowaMaxValue; - localparam int cTreadPointerWidth = clogb2(cTreadMaxNumber); - - typedef bit [cTreadPointerWidth-1:0] sdram_tread_ptr_t; - - typedef struct { - ba_t ba; - rowa_t rowa; - cola_t cola; - } sdram_tread_state_s_t; - - // - // sdram transaction types - // - - typedef enum {cTR_WRITE, cTR_READ, cTR_REFR, - cTR_WRITE_LOCKED, cTR_READ_LOCKED, cTR_REFR_LOCKED - } tr_type_e_t; - - // - // transaction acknowledge mailbox. use only for locked transaction - // - - typedef mailbox #(tr_type_e_t) sdram_tr_ack_mbx; - - // - // - // - -`endif
trunk/include/tb_define.svh Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/include/hssdrc_tb_sys_if.vh =================================================================== --- trunk/include/hssdrc_tb_sys_if.vh (revision 2) +++ trunk/include/hssdrc_tb_sys_if.vh (nonexistent) @@ -1,99 +0,0 @@ -// -// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline -// -// Project Nick : HSSDRC -// -// Version : 1.0-beta -// -// Revision : $Revision: 1.1 $ -// -// Date : $Date: 2008-03-06 13:51:55 $ -// -// Workfile : hssdrc_tb_sys_if.vh -// -// Description : system interface to memory controller -// -// HSSDRC is licensed under MIT License -// -// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - - -`include "hssdrc_define.vh" - -`ifndef __HSSDRC_TB_SYS_IF_VH__ - - `define __HSSDRC_TB_SYS_IF_VH__ - - interface hssdrc_tb_sys_if (clk, reset, sclr); - input wire clk ; - input wire reset; - input wire sclr ; - // - logic write; - logic read; - logic refr; - rowa_t rowa; - cola_t cola; - ba_t ba; - burst_t burst; - chid_t chid_i; - data_t wdata; - datam_t wdatam; - // - logic ready; - logic use_wdata; - logic vld_rdata; - chid_t chid_o; - data_t rdata; - // - modport master ( output rowa, cola, ba, burst, chid_i, write, read, refr, wdata, wdatam, - input ready, use_wdata, vld_rdata, chid_o, rdata); - modport slave ( input rowa, cola, ba, burst, chid_i, write, read, refr, wdata, wdatam, - output ready, use_wdata, vld_rdata, chid_o, rdata); - // synthesis translate_off - clocking cb @(posedge clk); - default input #1ns output #1ns; - output rowa, cola, ba, burst, chid_i, write, read, refr, wdata, wdatam; - input ready, use_wdata, vld_rdata, chid_o, rdata; - endclocking - // - modport tb (input clk, reset, sclr, clocking cb); - // - wire [2:0] cmd_vect = {write, read, refr}; - wire sys_reset = reset | sclr; - // - property cmd_onehot; - @(cb) disable iff (sys_reset) (cmd_vect != 0) |-> $onehot(cmd_vect); - endproperty - // - property rst_output(logic signal); - @(cb) (sys_reset) |-> not (signal); - endproperty - // - assert property (cmd_onehot) else $error ("command overlaped violation error"); - assert property (rst_output(ready)) else $error ("hssdc reaady output reset violation error"); - assert property (rst_output(use_wdata)) else $error ("hssdc use_wdata output reset violation error"); - assert property (rst_output(vld_rdata)) else $error ("hssdc vld_rdata output reset violation error"); - // synthesis translate_on - - endinterface - -`endif
trunk/include/hssdrc_tb_sys_if.vh Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/doc/hssdrc_design_document_rev10.odt =================================================================== --- trunk/doc/hssdrc_design_document_rev10.odt (revision 2) +++ trunk/doc/hssdrc_design_document_rev10.odt (nonexistent) @@ -1,515 +0,0 @@ -PK×.f8^Æ2 ''mimetypeapplication/vnd.oasis.opendocument.textPK×.f8Configurations2/statusbar/PK×.f8'Configurations2/accelerator/current.xmlPKPK×.f8Configurations2/floater/PK×.f8Configurations2/popupmenu/PK×.f8Configurations2/progressbar/PK×.f8Configurations2/menubar/PK×.f8Configurations2/toolbar/PK×.f8Configurations2/images/Bitmaps/PK×.f8-Pictures/2000041A0000356F0000214891083746.wmfíœ tTÕ†ÿ{“@xi3¦Fc‹«v¹šªÍ‚QP|Ä ˆõQˆ‚­êŠPÅúìÂJF*…å«B0¼¢‰-hM -ŠMŠ¦ûžûÏžs'‘‰Ö¶—µÎº{çŸpgæîÎ= ½€¸!é@o¤Áù/#ÎJD‚ûÚìÛ‰úØÎ\¢Œ=YF ÛÑ%IO9îÞÚÚj»Ž²,S¡—yœY¶3ëD¶e‘¹³ÎÏý—ýi«[ô.+ü[ŒœW?7j{ÅjK:ª’)UÎŽ¹J–T™s•l©2;æ*9Råј«äJ•U1W(U¶Ä\eTÙs•<©r k•ÁR%3Æ*623Ò­‚Ø«d¦[b¯’•nÝ{•ìtëØ«ä¤[5±WÉM·b¯20ÝÚÙ -Ïô+=Æ×®¬ »ªdglCìUr2꺡JnÆãÝPe`ÆmÝPePÆ”n¨’—1¢ª ÎÈŠ¡J¢©'¯º px§uÚúïöN*Efó´ã·Xè89þØü_Râ±þi…ÕÃr~t?‡Ç%`6b”7šÜU…?±´×_†y˜fF¥Ä•&¦Ÿ/Ÿ˜1Câ&¦O¶NCª…š<š~—u4¾0#Gâ“Gôî¹±÷97==>5%ò¬6ð3N$J¶_ÃH²Wå\¹,„ÑdõC¶ç‘­ÅùdkpY-."[‹ÉžÃ8²Œ'[Œ d‹0‘ìi\Bö&“-Ä¥d ä™pÙ£˜JöˆFá³°gÎea:Ùƒ¸Šì”’Íŵd÷á:²{ñ[²9¸‘ìnÜLvf’Ý[ÈnÇ­d·âv²[pÙ,ÜM6÷Ý„{ÉnÄÉnÀŸÈ®Çýd× ‚ìj&;;ÉFãS²Qøœìì&‰½dÅøŠìlؼþ!ÞrÙ$’…Þd…H";!ï^— -ÇdÃåí²BV€Ÿ(;ŒìtüŒìt¡ìd§™k­ÃNC¦²l²S1ˆìT &;Ç‘‚¡ÊNTv2ÙÉ8ìd¤Ÿ×OÂe#•";瑈óɆáb²a§l"Ù ¸„ì\¦l*Ùñ˜Fv<®Tv5ÙPü†l(nPv#ÙÜL6³ÈŽÃl²ãð{ew)»‡ìXÜKv,î#ËG9Y>Tög²c0Ÿì<¦lÙ`ÙŒ|‰óMMŸ"óifäKœoòˆ¾kÑYl9ÏUe½•õUÖ_Ù•¥(;HYš²4tíuú PX8 H–¤Ù¡’¥t±ûi÷/Òî_¤Ý¿H»‘vÿ"íþEÚý‹´ûi÷/Òî_ô­tÿðÝZ‡E¼N×VHŠÍêˆÓ¥Õ‘“»ªŽ}V‰Yqº¡³:2ßäÑô•fuÄé!NG™fòhú³:2\ŽÎêÈp“GÓ·˜Õ‘L9:«#™&è;v/‰g²—ï^|÷â»ß½Àw/.óÝKlî%‘½»WVHzb’xŒ §ˆ*hrWÕqçë/óÉ¢ë/ú$sŒ®O•ù4Ñ¥Š>ÅÛê»Öƒê‘‚ê‘‚ê‘‚ê‘‚ê‘‚ê‘‚ê‘‚ê‘‚ê‘‚ê‘‚x¤ŽÏ£³ç«c¯”ø­x¦¾æLÆÓ3¹w”¼üRX[Òæn’—W -k+ÛÜIòòIamJ›»H^)¬misÉ÷G¾?òý‘ï\æû#ß}ßýQ¸‹õ”kjoÌÅ,»ŠŽ;^™O]’ŒþhSe>Mt)2RÛi»Ö -ËÔ•©'*SOT¦ž¨L=Q™z¢2õDeê‰ÊÔ•©'*ûN"{;È^À.²ðY¾ «SR‡/ÉÖ¢•l -ß¡ŽÓNà5xµ¼s]¶}ÈVÑ™$Kô²•t&Éí¢éì!Ê%«¥Gqþþà§ÊŽPöseG)û%Ùóô(Éå*¬,_ÙP²8l=ŠÃNU6\ٙʊȖ£˜l9F+£ìe)O¶ È–éß²,Ã¥ÊJ”]Aöf=‡Re×*»^ÙMÊÊÈ–âwdKq«²Û•Ý©ìÊæÕ`.Y -îWV¡lž²G”U’-ÁB²%xBÙ3ÊžUVMV²jý»›j<¯lµ²µÊÖ‘-F=Ùb¬W¶AYƒ²7”½EVEèoÊÞSÖ¤ìC²Eø˜l=ŠÃ>UöÙ×ÜÊ7Ûï2W:¿3*$®0¹«òÚï2W‹3*$®0y4}ŠÌ§™Q!q…É#ú®u­ru.åê\ÊÕ¹”«s)WçR®Î¥\K¹:—ru.åê\Ê¿ãý.½­Ñrµ ïwÙ%Ÿá·ë~—ÍÒ36ê~—µ8XœBx¿Ëì°¿û]üþï÷¿ÿ»Ìïÿ~ÿÿëÿn©AüE÷¢Ô Y’f‡JÖÕ½(UÚ™«´3Wig®ÒÎ\¥¹J;s•væ*íÌUÚ™«´3W}÷¢8« -NuVœcô•…³ª°CŽÎªÂ“GÓWšU§‡8« - -&¦O1« -+åè¬*¬4y4}‹YUX$GgUa‘É#úý»×â; ßYøÎÂe¾³ðÅÿ¦³øfûDê¥ÿ‡ä¸AT!“»*¯}"õH]Ñ'™ct}ªÌ§‰.Uô)æØVßµ®RÿRÿRÿRÿRÿRÿRÿRÿRÿRÿú/Ø'¹Kâåe"ûD"wH¼|LdŸHä‡‰ì‰Üñò/‘}"‘»"¾wñ½‹ï]|ïf¾wñ½Ëþ{—ÈŽmÒû›EÑlbWᵇc›ø–fñ,Í&Ž¦M•ù4Ñ¥ÈHm§íZ§jR¿Ò¤~¥IýJ“ú•&õ+MêWšÔ¯4©_iR¿Ò¤~¥©[ýŠ;ùnF—Ç™ŸÐ߃ֶRø»^Æ•f´fÊó™éH“ÙZЩ&«u|§šìÖë¢jâESš1§sMæ“k²^è\“ýŽ‡Æ=c_ÿ¾œ¶ç°—©“€q3¦M¿²uˆåîŒVéh«ýœû|ö5•ÂÏ'lÛ>³x@ñØ©ÓO˜6y"fÞCÆÍͨYYW~eµû†BD¼¬ûÊA[§«³àl´ïþt`œyÌ¿PKA¢ˆ|" |TPK×.f8-Pictures/20000238000035BE00001F511036C053.wmfí›kl×ÅÏõc -vâà–ÜÄ­R5¢ -YÛ@’ªª~@Qê@§J*^1`À6kƒã0¯åá’ýÔ8þwxO¨¶Wö÷ªq:ý8±ãUë–ýn5N§?/îÀEÕfËþl5Nècc -;6¹†»¦ j@LÖ+²,ñS²ÿà6²ãçd_âv² ¸ƒì_˜Av3ÉÎáN²³¨'ûóÉ>a¯Øú É>D#ÙûXLöÂd'±„ìÚÈŽ£ƒì8î"û–“½ƒdG±Šìm¬&;‚Ù¬'{Kß©ýÝd‡p?Ùx€ì 6“À²ýx˜l½‚íd/cÙ ØIÖ]dÏã1²zØëãa±µ ÛƒÝdÏâ)²gð ÙÓø3ÙSè#{ýd‹d»ñ*Ùnì#{ÈÇA²ßãY/Þ$ëÁ_ÉòGñ6Ù.ül'Þ%û-Ž‘íÀ ²8I¶ï“mÇd¿Æi²Gð ÙVœ%ÛŠsd[pžì!|A¶É~…Kdò{^d=K8ì>ù­qØ}È%»cɺQ@¶ WmDÙ”’­—ß]‡­GYW’Eð²u¸šl-®![‹ dk0‘l -Bd«1‰l5¦­ÂÈVá‡d]øY~L¶SÉVâ&²ø Ù -ÜB¶?#[Ž:²_âv²»ñ ²»1‹¬sÈ:1ì.4u ‘¬ÍdËÐJ¶ KÉÚÑAÖŽN²6¬ kCÙR¬%[ŠÙ½°Ýd­¸Ÿ¬’µ` Y ¶’…±l1~C¶;Éšñ(Y3zÉšð8Y#þHÖˆ'ÉáY²EØC¶Ï“-D?Ù¼L¶¯’5`?YÍÇëdóqˆlÞ"›‡Ãdsñ7²z%«Ç»dwrõ¢XöNÍÁI²98E6’ͲYø”l&ΑÍÄgd3ð™Û+NºûÎåÝwnU¶·ßñ¸­Zɲä5ŒjaÙ«±£J]ù -ä|‘jaÙ«q:}©œ¯P-,ûa5NèGW›¤nhÏ>r4£Y¾f…šÓ¬T³ñšUhVÑÇÄê†;Ÿcxÿ©Ó=Ÿ•+ꤼ–£Ñ*Í"Žúe•yNfgtÊe'œÑ\’Yã¼ð3†ÃüŒág ?c8ÌÏ~Æøæ3†S§6a,ÖH掊å¨@¾%G¥£¬þ]ý#ºúGtõèêÑÕ?¢«DWÿˆ®þ]ý#ºúG¾–êï>­µY"ëŒn…dºZ±«´½:boÓ¯4«Õ‘Srk¯ŽœRãtú^µ:bW{u¤OÓéKÔêȹµWG6¨q:ý Z™!·öêÈ 5NèS§— áHæùéÅO/~zñÓ üôâ0?½xK/AÖî¼Q¬äÊëâDåv—TEÕØQ¥®|…r¾Hê -¥¾@mÓëËå|…Ô•K}©Ú&ëGW£:#EuFŠêŒÕ)ª3RTg¤¨ÎHQ‘¢:#EuFŠ¦ÈH©£ý›¯ÔY)øµd¦|u$³˜™œ'J¦¼äj›“ž&™²’«íMz’dÊI®¶$é)’)#¹ÚÁ¤'H~>òó‘Ÿü|ä0?ùùèÿ=¹U,{d¾è—Š~Õw©+^¡œ/’ºÙ -GЖËù -©+•­|ˆvtÕ0¦3QLg¢˜ÎD1‰b:Åt&ŠéLÓ™(¦3QLg¢XF3‘3Ÿø]¿Ãê2ñÚd'÷wBs;CñyòsK̤ÒTÅWŽ¨©Ž?<¢¦&þ´AcúmSò{ÎS>Ù˜ÛÑÖ¾,þ}‘/Frš(†Î9Ç/_9¹Ç–eÝRWYWßÒ^Y×ÐÖ¸÷*ž#[íéÓxaÿkî'9ä×äHäSç“BrzÕ³àlºÿ§aÀÚç¿PK–˜+¹è(2PK×.f8-Pictures/20000258000034EB00001F516ED001C1.wmfí›itU†¿º $lcb hPDéV-,B€€›‚Öd‘miYETÄ•ÈvÐQ‘QpÀQG‘#Œ:£2cæVõ[o&ÕäÐñœù!çÔé{ŸúúKSÝ©ûÔ[CʈÄt¸N¤¬¤ˆý/Vo1F¼”ÒåU]C”=*§ì}ñzûY §R”][GOâôã¿5/((P¡u ÃéPÆyž=2”½×)à íµîEõ]A¨ébÃ}=†û³ÇUMÏέÚ}”?k¤lÛ w¯Þªî=˜+âÃÏQN§ÛŒJž¯/¯Ï‹eµó¯À­.åô³Ô5’æŒLg¤‰ÛéòštÖ¤{Öä°&dzf6kf{Ö¬gÍzÏš×XóšgÍ Öœð¬ù5?xÖ$nM¢áUS‡5uÏŠWÍaÖö¬ÙÊš­ž5+X³Â³f -k¦xÖd±&˳¦-kÚzÖÜš[ß_åÙ§p'û,S­”!¾rÉF½ËÎ~¡Qá3VaRT—TÝ¥sÔ]êé.ã»ÌŠºK}Ýe]Ô]è.»£îÒPwù(ê.t—ï£îÒXwI0¢íÒDw¹5Ê.JR}ÉF›è»¤&£ïR/ÙÈ‹¾KZ²±"ú.õ“­Ñwil¼}—†ÉÆ7%ðNW0jDùÙURÏwA¢ï’æ;V]êûv–@—¾Õ%Ð¥¡/P]ù†•@—ƾN%Ð¥‰ÏE—x§KŒþÔù¤¢ÜxÅ>—¯ß¡‘mCî(¼7­q}PZbôã -Îÿ%)6Þ¸`¸Ï*mØ?úwz»)¦”t”¤›³ÐãÎIïOq6¿ûy¸¾xk¸;^:2õ¨4YY²òd d×’%‘U"K!K‘âÇpãî/íñú‹ö6{V)ö mŸjC Í6êõvµ>2¡YKyJ›ÕÌ,}ÝÉ}¯g猫³¡3´¡3´¡¿Ò†>™êcÚÐq8©ŽÁ,udjêö6mè-8¥H_°ýYjŸôÛCóÙEóÙ‰‘¥^¥ùl•A`/ÂwLíO®ùl†ï˜ÚŸ†m„ï˜êIøŽ¥ÖÊ°Õ°K­ÒŸÇ[IßYË1ÕRúÎbúÎBúÎ|™6—¾3[{æc©é’6M¦€M†ù˜êA™6æcjk -€¡¢ å`d©¡t lŒlWZ@WZDWZLWZÖ 6d»’ëEÝèE]éEèEèEí$Ö†d©Vúsb-e-X3fÿMåI0×LÕDž¡+mk$/€5WÀÈV°4ÙVOv‚¥òÞAªìs -ÉÔ†´¬Ž»UÑ•Þ»EÞûƒ«)‚Ý,«!ƒÝ¤‹C¬ºœ«&ŸƒU“/Á\C²]é°*r,Eþv=ï]\'ÿ«,Á*ÉÀ’ÄÀ -$ -+€kH¶+Ń]+åÁõ9Ä]=¹z˜dÉd•ÉªÝHV¬Y-²ÚduÉRÉ5"kJÖœ¬Yk²vdíÉ:“u!Ë ëIÖ‡ì²dYdÙdÃÈFùÉÆ#Ë%{€l -Ù4²Ù,²¹dóÉ‘-![FöÙ*²'ÈÖ‘m ÛDö Ù²È^!Ë'ÛA¶‹lÙ>²ýd&;DöٲȎ“ ;Iö)ÙgdŸ“}Ev–ìÛ«2¤Ð*û°”ÓgæXqg–žUଊž%Ó]t—Ý%@w Ð]t—Ý%@w Ð]t—Ý%𫸋{WÜfaS+^•.¶AœÒ§µãœr桪¢-1G¯8~½Âäèe˜ó¸çm€o™Ú>‚­fÖõ³®•´¬̺–Ò²¥e-‚[Ùy_lÜÊÎûÖ€Íæ=Àðh–lÀÞ®™L¸fÀ²l7}l,ËTS™på1áÊ“`“aYvjè&\“˜på2ášË2õè-°ñL¸Æ1áË„kŒÍo׎bÂågÂågÂ5–e;ñ`ÙpÝÇ„k®¡r,› ×&\ƒ™p -b•Ë2Õ@&\÷2áêÏ„«®~R¬/®¾L¸ú0áêÄ«7®ÞL¸2™pe2áÊdÂÕ‹ W/&\=™põdÂÕ“ W&\=˜pe0áÊ`ÂÕ Ww&\ݘpu“t²î`]¥XWéMÖ¬‹Ü ÖE‚¥ó›Èé2¬³ä€u–ûÁ:Éh°N2–l"XG™ÖQòÀ:ÈT°2¬½<Ö^æÍ»[‚Ý-‹ÁÚÉR°v²¬­<Ö߶TY ÖFÖ“=v—< -v—<ÖZžkMËjM˺“–u'-«-«-«%-«%-«%-«-«-ëZÖ´¬;hYÍiYÍiYÍhYÍhYMiYMiY·Ó²n¿JËr×Â8}*«Ï8±z‹ÃÙÈkÝLÐûM]WAo W¨­¬÷§èº$½U¾¤¶xkj>Í*Ÿf•O³Ê§YåÓ¬òiVù4«|šU>Í*Ÿf•_¢fÚþ’q~BI|_»p'÷;iƒr}ƒõûÞSTMjAÞkê,»bMZÁó5^ߣ+üšË8}JÉ  cÇ/¨m„Îá‘:Ýf\º/tüÊ;Üã'J©ÎU3²FŽ«š‘=vøP}Ž±qi½uúúkÙ±ï@®ûN^ò— ¶ÜÐ;%…˜{{#ýM -cœçüPK`”<6 -”4PK×.f8-Pictures/2000041E0000356F00002148F76C0DB2.wmfíœ pTÕÇÿ÷&ð¦Ýuk4¶tjÇiê#Á¨øVkTDE‘(D‰˜Zµ–¦Ø -Uk­:ØØÈFa´Z 1 -^QDW@PÐBQ©©Ñ¢ ©BµéwÏýï·ÌÝD6:Ú^fÎÜs~÷Ÿ“°»¹ßoÏ=Y ½€”sr€ÞȆó/UZŠ•Ž49öµO±Òl§×ÇvÎ¥KÛ'=Ë$a;Ù£eÐSŽŸ -okk³ÝŽ¶,3C/óuNϲ³N϶,2÷¬ó}ÿmØæNú;+úSœ;yJiEÿ‘¥•ýÏ)Ÿ2~*ê×4U6Jë߸¶Èå÷±ÍLÇX‡xþ|)üùHùu©š6ÿÚ¢é43_Ð>E¦°µŠiÿL‰fJ<3åš)÷ÌÌÖÌlÏL­fj=3«4³Ê3³]3Û=3û4³Ï3²¢™å•É×L¾gf¤fFzf&kf²gf¦ffzfæjf®gf™f–yf¶jf«g¦U3­í2OüÚs^qm,ó©¾>?…Wf»f¶{f5Óè™™§™yž™™š™é™™¤™Iž™ašæ™9J3Gyfúi¦>ÿøïõùè¯>ñ39W™ï§YÈ=8Ç´ßÕÏíÅ_±âIG³äÉ,ç$=K¾Ì25éY -d–YIÏ2@fy0éY -e–•IÏ2PfÙ–ô,ƒd–½IÏR$³l%;Ë`™%/ÉYläåæXÃ’Ÿ%/Ç*M~–ükFò³äX÷'?Ë€«!ùY -s¬ÍÉÏ20ÇÚÝ -Ït+'É×®ü\»f)È݉ägÛÔ -³æ>Ü -³ ÌÝ -³ ÊÒ -³åŽî†Yçæ'1Kº™%E^u¹×qD§óÄûw{“Šöbg‹´â·Z¿è9~×ü_B©‡Yÿ²¢_ÕÃr¾u?iG¤¤a46â|Ó¶H‹»©è;–öù«0ÓL«•~­'ÊÏÇÕXhÚuÒ¿ÎŒåÖPd™6Jú£Ì8Q~u,>1­Pú…fË»½ßcÓÓã]S:ÕÍ|ëì—q.Ùzy¬\Á²uK¶’­ÁÅd«1Ž¬—’-ÇedOcY&’-A)Ùb\Nö® û3&“-•d å™pÙƒ˜J¶@{óùŽ,h;ÏœË梂ìOò¼¸¬?%»7ÍÁd÷àf²?`Ùïñ+²;1“ìvü†ì·˜E6 ·‘ÝŠÛÉnÁd3qÙ/qÙ ÜKösÜGvªÉ~†²ëñY%æ‘MDz -Ù0ülŽTöc²¡æªë°¡ÈSV@v‘…Ádgâ²31DÙ©ÊN';CÉÎÀp²Ó1Šìt„•GvƆ‹”#;ãÉNÅDe“ÈNáûý ô¦(+';d'c:ÙI¸žì$Ü ìfe3Ȇè*ÁüšìDÌ&;·)»“ìÜEvîU6‡ìxÜOv<Ñúì´ÚÚœdûš–ŠBô6­XúÅfì¦:®r>`Z±ô‹Í8Q>$ç³M+–~±Çò]«‘Îú`ûžó¼ôPÖ[Y_e™Ê¾­,¤ìeÙʲѵÇ1¶Î=ßÃãçïØ‹œÑ!©[¥žorGI}œ+UÕUb‘˜Ë|ŽFãPñ’€åŽb¯XÇË· -·çÛ†o¾m¸Ì· -ß6¾N¶áV¬óÐ#…EGAeèèp…ºèaõ€°z@X= ¬V«„ÕÂêaõ€°z@øKñ€è\‡Å¬§k«&%fÅÄ©×ΊÉf3vSW¹Y1qꢳb2ߌåkÍŠI…“ -3N”™çj笘Œ0ãDùV³b’/GgÅ$ߌcùŽ=&Ýã‘ìå{Œï1¾Çøßc\æ{LwyL:«x¯.¬šôÄ$±29N‘T™»©Žk`¦œH.Sòæ˜8Ÿ%ç³%—%ù9Æç»V#ËÔ–ÊÔ–ÊÔ–ÊÔ–ÊÔ–ÊÔ–ÊÔ–ÊÔ–ÊÔ–ÊÔ–Ê:°¥ŽGgGXÇÖ”þ¥ØS_óH¦ÒžÜûM^æÍ–ÇÝkò²¦h¶6î>“—1E³¡¸{L^¶ͶÆÝ_òMÉ7%ß”|Sr™oJ¾)}sL)ZÏzâb·HâÓw×¾L9\†´ÌN²Yr>[r!iYí²]«‹UjGUjGUjGUjGUjGUjGUjGUjGUjGUjGU_‰uuïMŠu¾i½¬Ñ¦¹×Bï½7ïJuuÚnéï6ãDùùRš¶Eú[Ì8Q>`-—k¦ÓVKµ'Êï±/rZ½ôëÍ8–?°»a=¬’ýz;ÍŠº‘m]@fYcÉþ£ô.!Û‡ñd{i?AûcužVš{ÐÞ#ï²Ý4 ý¾ZM¬·‹6´ßõdïb:Y ®'{‡V´›ÕeÞæoBÐþ»ºÌNù -qÙ›4˜€ôf“íÀd£Áím¸›l -&h¿®ÞòšzË<@¶…¶´_¡­Ä7Ô^-ÏnÂ"²Mx„ìeø‹îOi@PF::\F]ÝŸR§•¹N+sVæ:­ÌuZ™ë´2×ie®ÓÊ\§•¹N+sÝ×pŠ³ªàTPgUÁ9&^Y(7« -»äè¬*ì2ãDùZ³ªàÔgUa³'ʇ̪ -9:« -+Ì8Q¾Õ¬*,–£³ª°ØŒcù»ëâ›…o¾Y¸Ì7 ß,þ7Íâ‹íY'õ?"Ç -’Š˜±›òÚ1²ÉeJ>Ãç³ä|¶ä²$2Çø|תVDý%¢þQ‰¨¿DÔ_"ê/õ—ˆúKDý%¢þùì‰Ý%ñr™ØŽ‘Ø/‰í‰Ýñr˜ØŽ‘Ø/‰í‰ÝñÝÅwß]|w‰2ß]|w9pw‰íáØ)µ¿E-¦ï&¼öpìoigi1ýDÙ,9Ÿ-¹´¬vÙ®Uªfõ•fõ•fõ•fõ•fõ•fõ•fõ•fõ•fõ•fõ•ænõ÷|ì3]žb¾Cw|^ZüLÑÏ„™P™Û–'Ï[ìLG™¼¶afòÛ&vš)h»1a&U2•¹wwžÉ{´óLþ³g -vxdÜGìóŸ«ÿö2ó¤aÂôi׶heXÍtŒÕþœû|ö53EŸOض}vIÿ’ñS+ú—”N›|9fÞCÚˆ–4¬hªŒ¾²Ú}’!b.ë¾roºz<›è3B˜b¾æ¿PK‰×ïU% ¤TPK×.f8-Pictures/20000261000034EB00001F5190F59A27.wmfµÛ œMåÇñg­f\g­fÒ™J·ãTh×4"ErŸ!—ˆaÜrk$$;J å’Ë „ŠD”„¤¢„IR©SNáÄ‘Nç4ç]k?û7C³‡cO>ŸõÙïú®gÞkïYë¿Ÿw%¥D¢V^*RZÅûm¶(+VJ˜Ç²ö–ØÞ¨Œí‹5Û¿ÍÈò+Åöj«šóøãyyyvp†ª–åÏPÊÿ:odÙÞQod[–Zð¨÷}OÛ'ó‚“NµB?E»~™½†VjÕ+«Rê Ìô²nÛ;Y›ÍVióö,‘$ý>¶?S5ë’°?_”þ|ªúuÑTûÿòBÕ%üù\û"IöGŽc%Kh¦³kZQÓ*lMjú‡­™@Í„°5‹¨Y¶æMjÞ [³ŸšýakNQs*lM+TSÁ -WS•šªakšQÓ,lM5akÆR36lM65ÙakÖS³>lM.5¹akŽSsüŒÏ‹~íy¯¸Â¿6¿æ¯Ï#®f5»ÂÖ¬¡fMØšYÔÌ -[3ššÑakÒ©I[Ó„š&ak®§æú°5ù¿¿ÉïÏÿÙWŸŸ.ðêSp&ï*se K’Ê'X5κúG¯X¥°Yª›YZFx–:f–Ÿ"ž¥®™%Ίt–zf–*ÎbKõ¤ëöÈg©ž`u|– Ö¨ÈgIN°fE>KÍkMä³ÔJ°vG>Kíëh1<Óå¬k#|íÚR#é„D>KrÒÞb˜¥fÒëÅ0K­¤ùÅ0Kí¤@1ÌR'©O1ÌR7©E1ÌR/))‚YbýY¢Ì«.I.–+Î9ÏÙ÷ïàÈKC¡QþÑ䉫ðw%%Ê<^îÿ_â£c­Vè«JZÞ·.o¶k¢JHsy[ÚúÛ3Þáï«BïXάï#}%Óßšñ@¿¨úRN–ø›cÆŽ¿_T}y«œ¸þ昱ãïUÌ?éoŽ;þ~~}ðÜØg›˜0ïšbõ¬¾«ïqòGŽ½MZ«m‘6j›täÚ$Uíu¹öZIS[#íÔVI{µ•r—Ú‹ÒAíy¹ö騶X:©-ÎjóänµÙÒEíéª6MîQ{JG®=Yº©M’îjIºÚé¡6Nzª• µQÒKm¤Ž\;Kz« -7¯€  -ÖW‚c’~jx'Ø_¨õ6¯ e˜×OÐÒå>µn2X­‹ Uë,ÃÔ:Èýjíe„Zª< ÖFTk!£ÕšËµ¦2V­‰<¬v«ÔÉ#j)¼3½YU«+ÕjËjÉ2I­ºLV«&SÕªÈSj×É4µÊ2]황v•<£v¹ÌV»Læ¨U”lµKdžš+Ϫ9:rí8Y¬g~ÓBö¶{[å`ë° -ØFl ¶{ÛŽíÄvac{±ýØìKìö-v;‚ÃN`'±a¿bÿÅò°(+d%¬•ÂÊ`aqŒ*pôb,û3vv%v5V»«ŠÝˆ%cµ°zX}ì¬v;ÖkŽµÄÚbiX¬Öë†õÄzaý°Ø l06ËÂÄFccìQl"ö$6›†ÍÀfcs±ØBl ¶ [Ž½„­Æ^ÅÖa¯a±MØVl¶{Û…íÁöbû°ØAìö -vû;†ý¨–ßYˆÑÎB¬„‡÷XÙÊËó*ϼKG›»DiË4ãL?XUø]½œ9îø[¦gúûEÕÇ›ã‰þ–iÆ™þ~~ýùÝõ½Nå™#ï®U+•Åâ°?añØ%X"–(çwó;7¡ã%Ãüü…'=oï’è¯M9`2]pož¹ßÎ4g&¸çÊRs^°w±INå­ÐÞOfï˜uaùé òÓä§ÏÉOŸ’Ÿö™Ô´ÉO{45¹öN²Ò:rí÷ÈJïhBrí·4!9öfMH®½Q’c’Yµuä¢MC®½ZÓc’YºÚ -MCŽIf=Õ–’–êkÌ1ɬ¯Ú\M>Ž=‡ä3[G®=S3cO—{Õ¦jrLF ¥¡'HCICãeˆZ@s‘k?$ÃÕÆèÈ5-Km„Ž\{ i¨ŒT¤Yɱ3e”Z?ÍJŽÝ‡Ô”Ajê¡#×¾GÆ©uÑüäÚ4?9&£WKÓüäØmIR-IR-täÚwh¦ò’Ù$’Ùd’Y(]¥®êëȵëÈÓjµ4g¹v -ÍYŽ$3ÔªhÎòú§¡ÄU™Äu­Ž\ûJ™«v…f/×NÔìåØ—Ê|µx ¥°Pó®—¡õŠ8y{{[‰­ÂÖ`k±×±7°ÍØ[Ø;Ø{Ø؇ØGX.ö)öööö7ì;ìì(vû'ö3ö öì7Ìæ~Í=(+•?+…yæbñØ¥X"V » -û öW¬ -V -«ÕÄêb7a -°†ØmXìN¬ÖKÅîÂ:b]°{°XÖë -ÄîÆa÷c#±QØXl6{ ›„MƞƦc³°9Ø|ìYì9l)ö"¶[…½‚­ÅÖco`oboaocïa;°±ÝX.ö öö9öö5ööwì(öÿ#{ïßJsµŽ–Оköʱw™Ù‹?ÏT HERQ€T HERQ€T HE?$…Vè=ËÏ€ç×k%{L6É5ûLzÊõ÷ƒU…çÏþæ>˜)ÌãD“ -&øûEÕ/ò;bÞýÂëˆÅùûEÕWð;bÞ;M¯#çïUÜk±ß‹ó÷óë Ou±aÎd)}nrIu¹¤ºHu’ê> Õm'Õ½KªÛª½0ÇÞBªÛ¨½0Ç~ƒØz:`k逽Bl°tÀ–Ó[FÒ[BÒ[HÒ[@Ò›KÒ›CÒ›©}//£…’ÞTº]“év=A·k"Ý®ñd¾Ý®±t»ÆïF’ïFï‘ï’ïú“ïúÒËÐTçØ=é€u£ÖUG®ÝYRëH–kG–K%˵&˵$Ë5#ËÝA–»,w«<®Ö€®XŠ<©VO¦¨ÕÑ‘k×Ôþ˜cÒÚÓjÕÈmUÈm×Ñ)«Ln»šÜv¹írr["¹­¢¦5ÇN0¿eAsd¡ZMkþûz²È2l9ö¶{[‡½†mÄ6a[±mØvì}l¶Û‹íÃ`±CØ7Øaì{ìö#v;…ýŠÆò0‹{U îU1X¬Vs°¬"vvv5v-vvv#V«…ÕÁêc)X#¬1Ök†µÄZciX{¬v7Ö -KÇza}°X&6Šea`£±‡°6›ˆ=MÁžÂf`Ï`s±yØBl1¶ {{ {{ËÁ^Ã6`›°-Ø6ì]ì}l'¶ûÛ‡íÇb_bß`ßbßcG°±ß÷Ìb5µ”:žYŒ¹¶•6ײsíŠögyÏ3ÇS篱eûûEÕW4ǽkeESï?¬?¿LM:Ì&f“³I‡Ù¤ÃlÒa6é0›t˜M:Ì&f’ ?Þçí -O‰±HZ,ëŸÉh“†~1™ç7“óÇ…õPmÙmÁ'&G|⋪]dîÍKä1óü<拪­`u0 ±«I‡]ýqQµÇ­:&¦˜d˜âók/,ž&ž&þJ2üYó cŸbmô½½ã¬ƒ%ñ!ñ&Ý}GºûšµÌC¬edÝòsÖ-÷“Úö‘ÚréÏå>"«í"«í$«í «½§ ͵·éz¤c¿M.Û¬iÌ[å² -ôØ^§Ç¶– –C[M[E{I“——kCyëyòÖRòÖbòÖBúdóé“Ícr6Ùj«Óé‰M“YjSÈQ“ÉQ“£&’£&£òGãuÒ{o·Lmœ®BºöòBm¬ö¿¼æ+jc´ÿå­7¯WE¢zD5’D5‚D•E¢º_û_ŽíP¦ý//YïV¢ý/ÇÌzä}¬Gb=2“õÈLÖ#Ð @'¬°¾tÂúÐ ë­+“®Ý‹Ogèʤk2ûiµº2é­‡‹ÞEºkOÌ뺖Tëª=1o¼¬ZRVgRVgRV'RV'RVGRVGRVRVRVRÖ]¤¬»HYíIYíIYíIYíHYíHYi¤¬4RV*)+•”Õ–”ÕVZa©jm¤Zí‰yÖY­µöÄ3ê®ÖŠOT·’Þj-µ'æ½Ó¹W­…öļõì~µæ2B­¹öÄûN£v§öÄó~éµfÚóìqµ;´'æ½›šªÖT{bŽÍTk¢=1¯3ž­v»öÄ3Z„-U»MžW»M{bŽÝXVª5fe²1+“·²2y++“X™lÄÊdCV&²2Ù•É[X™¼…•É¬L6`e²+“)¬L¦°2y3+“7³2YŸ•Éú¬LÞÄÊäM˜²B÷Âs*m®8Ñf‹Ñ«Q¸ûfœ9rf‹;GmEs<ÑÔÅ›­âµçwOÍ!Yå¬rHV9$«’UÉ*‡d•C²Ê!Yå¬rŠ5Yçÿ-LУüïPŸ;/8Sè³u=²’òzšç-ÿHa5ÕóF³¦FÞŒsÖ$ç­ Sîó€æRþ<%¤Çð!C‡åÝ`¯áEÍTÍ:óXðü•õg -?±m»eZ¥´ôC+¥õÒ¯·¹Æx\Òl-~øA^ÛòNVè™<ã/0$?åŸ))˜9*z´¨¿mò0ÊÿšÿPKeW~Ä -\5PK×.f8-Pictures/200004120000356F00002148A6E6969E.wmfíœ pÕÇÿ» $ AÚ{½%-ÎØ:“ªsqp|à AðH(‰`£­ïZAA­UÚ`TPD­Ö¨È+<@à"ŠŠ(/AnŽ T›~{ö¿ßM0{¹ÑÑÎ2sfÏùí?_âæfÏïž=^ m€´Ór¶Èó/]Zš•‰Vrlg÷´ZÙNï0Û9—)m¿ô,“„ídOA†¯««³Ý -'X–©ÐÆ|Ó³lç¬Ó³-‹Ì=ë|ßoìÝunÑi–÷Sô5zøøÎ}†—tî7vtѼZU]R)­såÊ Êïc›J'Z}¾4þ|¤üºtM›u^º•©¶GwÓ Ù¬îð*œ)ÔL¡of¬fÆúf&kf²of¶ffûf–jf©of³f6ûfökf¿o&by™ˆå—É×L¾o¦fúøfFif”of¢f&úf×Ìã¾™šYà›y_3ïûfj5SÛ ó¥ðä¯=ç×ø×&2ôõy~™ÍšÙ웩ÔL¥of¦ffúf&jf¢of¤fFúfzi¦—oæxÍï›i¯™öøîõ?øî³çï>õ+9w™cZYˆ¶ÏµN>èîçöêß±ê“ƪäI•~)WÉ—*cR®ÒEªÜ“r•“¤ÊS)Wé*U–¤\¥›TÙ”r•“¥Ê¾”«t—*GX©V9Eªä¥XÅF^4×ê•z•¼\kxêUòs­ÛS¯Ò%ך‘z•“r­¹©Wéšk½“z•n¹ÖW-ð›îlå¦øÚµ‘µ[ J—è¤^å¤hu TéÓUºE'·@•“££[ J÷hߨrJ4?…*™¦Jš¼ê¢ãØ&ëÔ÷ï†&åõg»ëŒ_k5þ 5Òäx´ùo‰¤iíµ¼¯jm9ߺ½´cÓZ¡/vc€iû¤¿ÏŒÝ”÷Ž¥aþZ,Ä8Ó–I™'ËÏÂ$»›ÈJ°ìØN6q² ø„l>#‡ÏÉ®Ã.²±ØC6ÿ!}d×à[²kä­šËFÁæèj¤[.‰L²hK6 íɆáp²¡òwì²"AV$ã.‚#Ɇà×dWᲫð²Á8Žl0~Gv¥¹ë:ìJä)Ë'„ndƒÐì -œJvN#»=É.ÇÙd—á|²ËЋìR}ç~)ú*ëO6Èâr²D6CÈ.ÁP²K0‚¬?®&ëk•!+Ä8²BL ë‡Èúád¸…¬·‘õÅd}1‰ìbÜCv1&+›JÖ÷“õÁCdáa²‹ðw²Þ˜AÖ[Wzc&Ù…˜Mv!æõÂ?Èzá² ð/² PAv>æ’ydçaÙyXLv.ªÈÎÅr²s°Šì¬!;ëÈÎÆÛÊÞ#;‹kaém"ë‰-d=ñ‘²dgâßdg¢†ì |Nv†y¿í°Ó±‡Ìë…ë½7Ïà{óLxs¶s<Ϊ«s’ -ç¹ttE[ÓzH¿‡»©ÆçÅ,92­‡ô{˜q²|DÎç˜ÖCú=Ì8‘oÞ¼é¬6ì…¤×ZY[eí”uPöKee•å(ËAó®cbíÃ;ßÚççoÜ•œQÇôý2Çï+rGU/¾s-GâY±™Y -G'q•åŽÎÂ>1‘]V` . $0À@\H` ?uqg±KpúóFaeéè(Ešéêêêêêêêêêê?ˆxOz–0¡æ­®š•gwVVöš±›jÜÂÆš•g®tVV›q²ül³²2UŽÎÊÊT3N–˜••"9:++Efœ,_kVVN—£³²rº'ò»M¦Ï•l¸Mà6ÛnƒÀm\¸Íé6™œÙÛ4cu%CîþmåŸ!÷ôts™t^ì çC’ë ù,sLžÏ–ó9’Ë–|Äëç›7o«A«A«A«A«A«A«A«A«A«A7bP_Gg7Yã&•ùƒU;s%ÓiTî³*?›ò²cë=§ò3)/;»Þ3*?‹ò²‘zϧü ÊËÖÖ{6ØS`O=öä²Àž{úyÛ“7Çeà6±I’˜dún¢ñù°ƒœI.KZ‡&²Ùr>GriÙ -²Í›+KÕ˜JÕ˜JÕ˜JÕ˜JÕ˜JÕ˜JÕ˜JÕ˜JÕ˜JÕ˜Jcjî^ž°5À´NV_ÓÂVc×7±—gŸø‘Óê¤_gÆÉò³°Uæ)§í”þN3N–Y+å>ê´µÒ_kÆÉò»¬×Ä•œ¶Pú Í8‘?´'i¿² -ê…ìˆåùRÈHö Ës£öÖ ²,Ës£¶Ö²¶VY†åyP+k™myÎcYžóü—¦²¿Å²oäš»l?M'l²¯ÕoöªßÔâV²=´š½wª÷ÝMö%­&,x/Ùç˜Jö™ºÌ§ê25x„ìü,ŽGÉâ('û3ÉvÐ`ÂövÌ!ûÏ’mSoÙ¦Þ²/“mÅ+d[Ô[¶¨·lVoÙ¤Þ²I½åC¬ û«É>@Œl#mÅqÕõdïÓVBöl$Û ÿ7È{|ý:N»ƒì]|Löm%$½OÉÖã ²õøŠìmÔ’½E[ Kï²u´•°ý&,ÞoßDï·k‘A¶mÈbÈ"[£Ž²Fe5ÿ¦¿î¨¬Ù*M¶ -•«ì·do —ì -¯,ª,_™ç(+ÕQVª£¬TGY©Ž²Be…:Ê -u”ê(+ÔQ–«£,WGY®Ž²\¥Z¥Z¥Z¥Z¥J¥J¥J¥J¥Je™:Ê2u”eê(ËÔQ–ª£,UGYŠ)ʦ){€l þJ¶(+Sö(Ùb"çsL+—~¹'òÍ›—ÊÔMÊÔMÊÔMÊÔMÊÔMÊÔMÊÔMÊÔMÊÔMÊÔMÊ~ä½2GÊl¶¼½2°Æ‹Ox{eâ2?lÕ½2oÊk¥î•Y„}2Óê^™`†fø`†÷X0Ã3üÿÛ ïÎsqþ©{Qæ",£,%£æîE©Ð¹·BçÞ -{+tî­Ð¹·BçÞ -{+tî­Ð¹·BçÞŠŸà^geÀ™#•ç˜|u`¬Y8 Ggeà€'ËÏ6+Ûåè¬ l7ãdùˆYX-Gge`µ'Ëך•yrtVæ™q"hOSwÜ!pî¸ÃÏÓ¾ß^U2ÃÇä¸NR13vS~{=V!$¹’Ï2Çäùl9Ÿ#¹lÉG̱~¾yóRL -%¦†SC‰©¡ÄÔPbj(15”˜JL -%¦†ûìõH<Ëð³•Ä^Äs ?SIìõH<Ãð³”Ä^Äó ?CIìõH<»ì$°“ÀN;qY`'4w/Å™Ýk$QcúnÂo/Å1“±’ÓO–Í–ó9’‹HËnmÞ\W#‰«‘ÄÕHâj$q5’¸I\$®FW#‰«‘Ä[ÔHÜó‰Ïftyšù-ñ9hõ+yŸõ2´$Z—'¿·Ä™Æ2yu½šÌä×ý¾ÉL—º›’fÒ%S}¨éLÞóMgò—7é²Õ'ã^±ï~^NýkØÆÔi…¡×?¡î4ËI’U:ÑjxÎý}¶3•¼ß'lÛ¾¨°saјñ ‡5Bî~n-­wM -æ.®.ñ^Y ->¡ [u_9¨ï²z<›ì³?˜f¾æPKªæm“F |TPK×.f8-Pictures/200002060000355500001F51E083C96A.wmfíš{hUÆïÝd7iÒ†Ÿ}|6µ÷óC-þRR] êUj+X«˜UhÞÊd¥…šNh:•š84q¥fša¥f š1¥æ84Ç•š3ÐœQj.BsQ©©âRSÅUšh”šh:”]©‚fH©…fT©™€fB©™fF©™‡f>C3G<÷oÏüÅeß×ÑLã÷9ÍTš=ÐìQj: éPjœkaûçÿ²ðJž¿Â+9½’yÅ^WÀ)æ- î$Ö,ýêO'Ùª4P•\Wi¤*1×Uš¨Ê‹®«¬¡*ﺮÒLUŽ¹®ÒBUN»®ÒJU.¸®ÒFU*¹Û*íT¥Þe5Ô‡ù=î«4„ù÷UÃ|Ð}•¦07ÜWYæGÜWióSî«´„ùœë*ím¥ü¦+þíE?U©kþšE\^t4í{ÙM{]s—‹£±êøè*¨o®b×/Zga—qúŸœ9ÙÖ´›Ýó2mWŠsòùï\îUÈÍ^Nc•¯€­cÝìA1tšë"¶TÒ£fê·QþI1tšë"Î¥?@ù÷ÄÐi®‹8—¾œw³j1tšë"Î¥?Où?ÅÐi®‹ØÑ[çF[pn -Ÿ´ÏjÔvµÎ¬‚fëÁÛöØ&°-`=`[Á¶ƒ=Öö4ØN°]`»Áž{lìe°°WÁö½ f€‚í;ö>Ø8؇`‡ÁŽ€ûlì3°)°/ÁN€}vì[°°Ó`gÁ~;öØ,Ø/`s`ó`€]» Ƹd—¬,V¶¬¬¬ì°•`°U`7€Ý v+X=X#X XØí`w€Ý vØÝ`÷‚­»l=Ø°`ƒmëëÓÁ¶ƒÅÁúÀv€í{l7Ø ØØs`Ã`/€½¶ìu0ì-°ý`ï€;6öØa°ÀŽ‚M€M‚›ûìØW`'ÁNÍ€}vì{°s`?‚Í‚ý 6ö«ÍœUVÀ^e™ìkæöFžJ™ÊÌ^àg±b1b4‰ØRe凜¯#Fó˜ˆséC”¯#Fó˜ˆ}~½e+é2g4+++++ UƒÕ‚Õ²üΣ³Š•ùBÅñg÷fTíïe¨«¯CÔGÑ6D‡(:€¨†ús9—ÑŠÎs¯KKæui¯K{]ÚëÒ’ý÷»´u§ž-cƒÄdTIQ)¢k) -åÙ?èŸ ôÏúgý3þ™@ÿL &Ð?èŸ ôÏÄUéŸò‘É·ß*½S¬ÐÍ>g®Ð£"¶TÙJ\¬Ðé -+ô¨ˆséÇÄ -Ýìæ -=*â\ú*±BÒÖ\¡GEœK?/Vèt/+ô¨ˆ}öþTœÉ"¯ÿ{ý_óú¿×ÿ½þ/Ù¿Ýÿƒv÷+Êc•`oP—6hû6© [ªì½£Œò¤+#}©ØæÖ×P¾–t5¤‰mº>¿ÞbÀep\†—aÀep\†—aÀepF—‘ý<šïjdwÁ«â:JÄ™ôÛ®Ãz. rRO{& rR;–ö<@å4¤¶*íY€ÊeHí|ÚsÏaxÃsžÃÌsÿ‡!û@€î6ÅtwñÓØwUÏ(£|éJi”-¢­¡|-éB4j2´ùõ“$\E®" W‘„«HÂU$á*’pI¸Š$\E®"¹¤®ÂÊ;o´ZÜ'>a)ÞxK¯$ß—è¨O=Jß›“ɦiHíZTÓ˜zmQMSj\¡Q½ã‘~ÌE¢Në~ª¯GênݹsUªã™9ëü•ˆJòü1MÓ:º"]›ãý‘®h_oÝmL\Hã¾ÙYöɱ©ùMf¼Gɇg}S,Ýÿ!Ëìl®7”Mèûü -PK¬ý-ü\"-PK×.f8-Pictures/20000234000035BE00001F51D22D0CD3.wmfí›mlTUÆŸs§/SlµÚi§MêÚkŒqÚêf?löÙl*Àhv5ZK m™"åeT¨ -#íVªÀ¦âj»Š_q´¡ Å—Ô„U£h\ŒL`•µˆîì¹ç>÷Ì´;whöŽ›ýp›œÜs~ç¹ÏLïLïÿ¹çÞ -¾åÀ8TÂüÉ‘Í'üÈ•ÛBãjá7ÌÞy†9ç—íÙJ ÃÔ^%ùrû£ä‰D°®B9¨ýÌž0ÌY³gAfÍš¯{Öø6a™öû]Ìl7.¨šÚ©š>/\߆×öíì–­j÷âëÊi‚(w|>¾?Rî—£Õê'a«s•_À¸µªWbä‹ZØN£5Ó´fš£¦UkZ5]ZÓå¨éך~GÍn­Ùí¨ùTk>uԜњ3ŽšRakJ…“¦Zkª5Sµfª£¦EkZ5ZÓé¨éÓš>GÍ Ö :jiÍ!GÍ°Ö Ðœ”<ówÏüÆ¥ß7©9®¿ŸÇá¤Òš!GÍ+Z󊣦Wkz5ZÓᨩךzGÍ­™â¨¯5ã5É¿ß ðŸÇôÙç»ÿòì“êdže~™+:?(jFý¬^ê+•¤s©–.S]»ÔH—×.µÒ¥ÓµËDéÒçÚe’ttí2Yºrírtvír­t ·.×I—KÕ¡ øƒ{—ê hrïRËÝ»ÔÅ&÷.ƒb‡{—IAñ‘{—ÉAñ]>é"q™ËﮚÐ)¸w© -}—‰¡íYp™Ú˜—É¡h\® Í΂˵¡º,¸\ -¹pñ+ŸüÖ…PŠKÎé3º~[=3 -Ù½älmJâJŸÜþBý.e9~qFØ{å ó¥Ï—íW¾\Ôɧ«–'êTƒ°TöËHý|6Õ¾’ý¯Ô8“þIìÀ3ªí‘ý=jœI‘èF¹jke­gÒŸ·ã¬jM²ß¤ÆI½ulŒQÇ&ßáªÉÏ£êÓFõJ CÜ@ö/Ì$û 7’ý€›ÈÎàf²âOd§q Ù)ÜNvõdß`Ù öÆטMvÍd_b.Ù—“Æ|²¿£ì3,&û ²O°„ìc,%û÷“}ˆed±‚ì :ÉÞÇ*²!¬&{kÈÞEÙÛXKöÖ“íG/Ù>l Û‹ÇÉö`Ù ž"D{»xõ0vb3ÙN^&»¯’݉²yØIÖ†]dmxC³½da¼I6Èæâ=²V ‘µà Y > kÆÇdÍ\©sð9Ù&›#dM8JÖ„ãdø†lN‘Í·d -øžÌîR®´óy¥í‡]Ííå"‘0•#«VŽ<¿S-,ûa5¶Té«\‘œ/Q-,ûa5Τ/“󕪅e?¬ÆIýت`‹Ôì™Ç;O³qšjV¬ÙEš•iV®Y¥f•ÛqL®dØóyï?}ò1Gå9ùb†”×qô5æÉô2‡£7d•Ù!ó‰5Z'ÏlÝ2}X£ÙøQæŠÓÂËóò„—'¼ª+}TWú¨®ôQ]飺ÒGu¥êJýY*½}ÖdÉ\3¶•ijÕìÈ檇¹Í¼òѪV=ŽÈ­¹êqD3éûÕª‡YuÌU]jœI_ªV=zäÖ\õèQãLúaµêÑ ·æªGƒ'õé“ŠßáHxIÅK*^Rñ’ -¼¤b1/©Œ=©øY§ Æ°ò‘GežˆÉí&©Š©±¥J_åŠå|‰ÔK}‘ÚfÖWÈùJ©«ú2µMÕ­ -ÆtŠé<Óy(¦óPL硘ÎC1‡b:ÅtŠé<K“‡ÒGó¹­ô¹Èÿ³ä£Bu$s˜¬»BNÙÈÖ¶¦ÜrÊE¶¶?ånS&²µ¥)w‚œò­N¹ äe!/ yYÈËBó²—…þŸ²]±òñ²ÌR1 ú–"}u+–ó%RW$[ñ9´r¾RêÊd«¡[å‹ëü×ù'®óO\矸Î?qâ:ÿÄuþ‰ëü×ù'žÕücÍ'ŸÃ·¸O½B6žyMu²Ÿë¹#J4ÈÏ-9“NSXzNMMbý95µ‰ç4NÏ"¥¾çå“‹;µ/X˜¸RXgøLNÄÈ9ëø*'ûøÁ0ŒëgTͨo[P5£±½¹ «Ï“­îØ1¼¾gÄþ$G<ýdµ>)¤&U= Îfú¿ -úÔ>ÿPK7oâØ1PK×.f8-Pictures/20000257000034EB00001F51DA29F945.wmfµ› ˜MåÇßµf0DÍ´–jdŠ…mÆqÉ-a¸G Æe4îL2®;rË%—Fv®!ITÆ5·ŠÜ -ER(:Q.ÅIçÔqNs¾µÖý÷pfÇžzžõìïû­w^ÓÚÛú~ëÿmš itŸH!‰ë¿Pu„ha’O½Ö+j¢[£»të\˜:þ¥Fš])ºU[^M -¨×+ž••¥;ÊkšÝ¡ ýsÖHÓ­³ÖH×40ç¬õç^×ÍršÎÔÜߢMßÔä!1 Éi1­¤&õ—»÷¤íTGÌÎ}i"ü9ºÝ©‚V,àï‚ß?Êjû¿,·:ŸÝÏÔï‘8{dè´8q;Ý\“Àš„€5)¬I X3‘5Ö,eÍÒ€5ÛY³=`Í ÖœXók~ X¡¹5Z šò¬)°¦)kš¬éÉšžkƲflÀk|k6±fSÀš£¬9°æ -k®ÜPcñÜ?{Ö'.çŸõ×\äçó¢ª9ÄšCkÖ³f}Àš Öd¬ÅšQk’X“°¦1k¬)Çšrküï‘ÿ½þ7ß}®ÝáÝ'{'ë.ó`>M 56칿޹6úMצ@€§¦0\Õ/ñŒãúQyì°´;¤®šÃHk°}’¶[Ú€}$mÁvH{°í™úé¶I:‚­—gÀÞÃÈÔ×J°5™ú*é -¶Rº-“$°¥™úBéæ“ž`’ 6OzÍVï§ÃfI°—¥/Ø4>×MÅÈÔ'És`ÕgÂa^6N–!`é2l„ K“çÁ†Ê `ƒe$ØÖ_Fƒ¥È8°¾2,Y^ë)Àºáóiè]12õgd*X'™ÖNf€µÅÈÔ[É+`-e6Xs™Ö #SR2ÀËk` -ÄV_^«£>ý«-KÀjÊ2°êïˆÃªÉ*°j²¬Š¬«"ëÀâd=X¬l«$[À<òXEÙVAv•—Ý`Ë'`åäX99VVƒ=*Ÿƒ•‘/ÁÊÈW`¥å$Xi9öœ{P¾‹‘ó`%å'°äX ù,Zþv¿\+.¿ƒ—?ÀŠÉÀ¢ÔC¥ÃŠJî™E%Ÿæ0CÂÀ )¡î. —p°puçqY$Ù}dÑd1d‘•!{”ìq² -d±d•Éª“Õ$«CV¬!Yc²§Èš“µ$kMÖŽ¬Yg²gɺ“õ$ëC–BÖŸl ÙP²ád/¥“%O6‘lÙ4²éd¯Í!Ë {l!Ùb²7ÈV½Eö6Ù:²÷È6m"û€l;Ù‡d“í%ÛOöÙa²£d_’}Mv’ì;²³dçÈ~$»Dö3˜?(€t L\k°^Ѳ²¬ÊWÚPµ6²T5NµçNUÎ+suÞ°T5Nµç¹ÕGªóÑö‘ªÆ©öÜ_{+·•6Þ82Ô(?Y!²Âdád÷’E’#‹&‹–Û»ŽþôÅ=Ÿ?À­Y³b¡ç”[|«¼Ì™-—þ²P]gVOVH -µª83SŠ*û¹[sg×Ôì²vgt–t–ôè$ÌÇп¡‡ùú1˜©ùÊšÚ¤í‡ù˜úé¶#Sß%ÁvÐw¶Òw¶`dêè;ë¥;Ø:XŽ¡¬ÉõÕ°CYSo°å°C–cê‹¥ØB¸©/€Ûú|uý6ncèsh93i9ÓeØTZÎdI›(#À^„ï˜úXIß1õ‘2ì 6¾c(Wò‚ -‚ïÊ•&‚õ£ù¤Ð|zÑ|’1²Ê—iH®ùt–™4¤Y4¤94¤94$׆ZÊ«4¤ù`OцšÐ†цêÓ†êÉb°ÚLükÉ4¤•4¤U`Õe - -i- -é}ÒzÒ&Ò’»cP ^dÒG4¤Ý4¤}4¤`Ég4¤Ã`ÊQ°GàE–!} -ö°|CCú¬¼ÈT^ô -é¥{dþ´—îõ!R'CßI÷ÚÆüi+,ÌÔ7ʳ`™t¯w‘:ʸܬémX˜¡¿…ÔÉÔW0kZŽ‘©/aÖ´ˆYÓfM¯1kšÏ¬i³¦9ÌšfÉ°HL}š ›³ŒkØø˜©Cêd(÷–ŽÔÉPî•–†ÔÉЇÑÂ3H KeþÔÖ‡ÖK&ƒu§…%1ê"ÓÁ:ÓÂ:À½ ½=’(SO¤…µ–¹` p/C¹WXS¸—¡ÜkXC¸—¡?¡ž!VWƒÅ3“ª…$Ê {™Ê½Þ«.oƒUEe¨Ñ{`•‘Dj´,V¶Ò¸¶yDʽ>« {ÀÊË^×A0×½¬LêXY¤Õ¦r¯ã`eðmS¹×)°ÒêÎâ°Rrì!ùXŒüHãºö€\+!¿€E˯`®{™Ê½ü™Ô¿ÀŠÉŸ`Q꯸ÊJ(V™ì™TA°{å.°¹‡«Q8G\«Š’E‘ÝOV‚ìA²Rd•%+OV‘,Ž¬ -Y -²ZduÉê“5"kBÖŒ¬Y+²D²ödɺu%ëA–LÖ—¬Ù²AdÃÈÒÈF’"Gæ%{‰l2ÙËd3Èf“Í%›O¶€lÙ²åd+ÉV“­!{—ì}²d›É¶‘í ûˆl7Ù>²d‡ÈŽ#;Nö -Ù)²3dß“'û‰ìr.îó(xéTå…”P«|¨ý:?×u[½#b¨:õ.(_óÙóÜê‹«óѪ®¸ª´_³×ßÞºî£áùhx>ž†ç£áùhx>ž†ç£áùhx¾ /çëh};-gÓ ûKŒ¯°}%C•Ñü®¼åOe{Ú㜮º[›¢ž²SÕSuou¤à‰;PíR¯Ö­Iêý™ds«ÐÚ+Ëë¢ ¯‹=έöŠVM^¼ú¤ÆÛcíÙÝuÚÝuÚÝ´»0Yû -NgêWirW˜¢]â®áEîžgbvŽ‰ÙY&fg¸CxŠ»'™Ž`:vœéØQÚ˜ô9Ò1ë›vn&ö)3±ýÜùÛ ³öA‡‚}ÌLl'Íkwþ¶Ò¼¶Ð¼60ÿʤy½ËükÍk -ó¯ÕòØ›ð-CÙç°eð-CÙçt°…̺^gÖ5Ÿ–•Á¬k-k6-kÜÊÊû|`SàVVÞ·l"ÜÊÈ6š€?ëùÌM¸Æ3á˲Üô°1°,CÍ„+ Wºl ˲RC7ázž W®á°,Cöƒ -eÂ5„ ×`&\ƒäØ@~§v®T&\©L¸úÁ²,'>Ö— W&\½™põ’«`ÉL¸z2áêÁ„«;®$X–¡wcÂõ,®.L¸:3áê,EÀ:1áêÄ„«#®ŽL¸:0áêÀ„«=®öL¸Ú3ájÇ„«®¶L¸Ú2ájË„« -®6L¸™p%2ájÍ„«5®VL¸ZIYk°–Ò¬%vþ,Ö ìiìüjÔ -,ß?N^`-°óg¨Ñs`ͱóg={ &ÖLžk†?+ -övþ õ´ò"XSìüYl -Ø“Øù3Ôh&XìüYÏ7óÀcçÏÚ‡÷5ÂΟ•ZÕEª£ø -µ··¦fÒ¬2iV™4«LšU&Í*“f•I³Ê¤YeÒ¬2iV™yjVÎyÿ¿qxˆý'äÅ·´³wr¿‰Ö=Í“ÕC½oþ39ÕTÊJ¿eMlÖÜ[ÖÄe½ &зç²ÿÎí>ù¤û°ÁC†f=¦9÷ðÜ:UÐn<ç\¿Âv'÷ú‰®ë-c“ú‰ILÜ·—ºÇX8¿:š_¸ ›wíIsßÉþ½‚ø-×y§$»ó¬àlnÿÈ‚!öÏüPK€‰n:MŠ4PK×.f8-Pictures/200002180000355500001F51D15B9C9D.wmfíÚ{pTÕÀñsoÞ@ÙM–´ÁÆÁÖ¡HÀðûûkÛh%>ŠÖ*èÂFØ0!@¤<—‡ òDDVžåUÜ" -åU°)ZŠJÁ"ZŠ–‚¥@‰UÔÎöwïžûÝ$Ý»¤,þј¹sÏùœßþ²Üݽ¿_NÖP9J¥õô)ÕJ*ë_ºiF¶Ês³›‘nZ£Ö¦µ–-Ç'22ìHeZ±]d’%çÏģѨËÐÅ0ì 9ö㬑aZ«ÖÈ4 m±Uëç~jž‹Æ’Î4œgq{EÐ_]t‹¿¦¨ïÐ`ÿJµi÷žšírm¯¯QªXÿÓÎÔÕèàúüÒôóÓª—N´ý/êDgØù¼f[ÕËyÌ,£—r25éKL_טJb*]cꈩsYNÌrטÄìt9BÌטóÄœwÉ3œ˜<Ã-¦„˜ט2bÊ\cÄ\c&3Ñ5f1‹\c¶³Å5æ1‡\cˆihsF<ù{ÏzÇ%~l<¦ž÷g½r‹™JÌTט2bÊ\c⟅¶ê¿ÿ/Í?É -ùInœÉúÄ^aÈšÏèÙìN5þô7–DYJ$Ëm)gé.Y‚)gé!YjSÎr½dY–r–Rɲ#å,=%ËÛ)gé%Y>N9KoÉâ5RÍÒG²§˜ÅT%Å>ãæÔ³”øŒSÏÒÝgŒO=KŸN=Ëõ>ãÅÔ³”úŒ7SÏÒÓgœI9KŸÞ¹Fç‹~ïfÛYÒ%K×Ò}ª(ÅÏ€<›>O¨Kðlút--OáÙÄò¤É§ ¸4Ouº`žæU&^ÿœQ|µW£›¸çËTir¾Ê¾&ùéÙƇ†ó¨LÃúÑWÈqMZ†ºU=¦î°é2žnÏcQNÚ4~° ªì# ã€=O¿TÖWÚG@Æ{ž,¾½1@u°€Œö2Øóx|ìژͮM–KŸœM×зÙÈcÖªrm“ÕÚ&é‘ל úi¯îÖ6FÝ«m´ú™¶‡ÕýÚFªþÚªÕƒÚª”_[¥¤-(×,fr­cPC´ùÕPm~yEÕ`£±±Ø,„MÁj±iØ l66›‡ÍÇb‹±eX|´‚ÕÕØl¶Û„mƶbÛ°]Øn¬Û‹íÃöc°ƒØaìv;†ÇN`§°ÓØ9ìCì<ö)Šñ ñ,¬5–‹]‰y0V€uľ„u¾ŒuƮúa%X)Ö »ûv#öì&ìf¬ »+ÇîÀúa÷`÷aý1?6Œ±*¬«ÁFac±G°6 «Å¦b3°'°9Ø\l>ö,¶[Š­ÀVbk°uØF,‚mÆ^ƶa;°ÝØ+Ø^ì5l?öv{ ;‚½‹ÃÞÇN``§±³Úâ¿«eéßÕ²•S­óµF4jE6­(érïmeAíy,*qÊ•u}e´çÉâóe½Ð>‚2Úóx|Ë*ÔC×tä‘Q&Ö -kƒµÃÚcùX¬+T-»Žñß…õL—矸+±fÒWH5]$ýGl6C -“Nd°žU¨UÒ7,eV U¾½áÌ>–ÙYãâjýRjýRjýjýBu—¶ê'Úæ«{´=£+¼×œK]Šºþ$u}–¨m†ªÐ6]=¤íqÔÕéºî5“ë³)j¸¶Iº®{̉j”¶GÕ:qÚÆQáÇRáG«ÉÚFéNÏkÖ¨©t%Ó´ -W3µU«YÚªt­÷˜CÕ\mAõŒ¶!*Ì{È©úòŠÆl zNÛ@]õ­ÏìJjÚjl¶‹`›°—±­Ølö -V½†íÃÞÀ`oa‡±w±£ØûØqììv;‡}„ÇþE±4îoÜór°ÖX[ìJ,óa_Ä:bWc°k±ÎX¬Ö+Åú`7`ßÂnľ‡Ý„ý+ÃnÃʱ»°~ؽØ}ؘ«ÀcC±*lVƒÆÆb°6«Å¦a3°ÙØl6[ˆ-Æ–a+°ÕØl¶Û„mƶbÛ°]Øn¬Û‹íÃöc°ƒØaìv;†ÇN`§°ÓØ9윶–ÔÿX -™¢Z«ñbÎÌ+³\fe–ßÂÊ¢2‡¨Ì!*sˆÊ¢2‡¨Ì!*sˆÊ¢2‡¨Ì¡Ï¥2;ò,Þ‡´l¡¯½ƒ`ý¶lí Lµç±¨Ä=P¥½ƒà—³µƒà·çÉâ—Û;~9[;~{ž,>ÏÞA°î{Ö‚ßž'‹o°wür¶vüö<Ÿ¸³Èv¹’9úµ¹¼‹`ßó°Ë»—w,»¼‹pyÁ²ÿ¿]„l]CsZ°‹%÷±VòQ–Ü»Òí󼤨¬{$®ÄçÚçäñ²^(qŸoŸÇ·¬B…éUÂô*az•0½J˜^%L¯¦W Ó«„éUÂô*á½Jâëh}#%qÏ’ý¹ô.mì+™.µyô.¥oÙh]u'¶Rúš*éqËQéÒã8±ËýÕí_qbóýÅíWqbýµãRô)ëéSÖÓ§¬£OYMŸ²Jï…xÍåº;ñ˜ËèS–Ч,¢Oy–>e¾þÿ{ͧéSæÒ§ÌÖ݉µSR¡mºîN<æ4ú”:ú”ZúgWÄ#ÕHmήˆÇ|Tw,^vE<æ#ÒÍÇÌÙ±z«IÚœ]tYuÚFÒ»Œ wqvE¬~ëImήˆG:¯yÚœ]k?m¶€îb<æ yw8wçÛM~õ<ö l-öKììEì%ì×Øvì7Øìwثذױ?b‡°·±w°¿`ïaÃNbÿÀÎ` -Ø¿°O°Ï0Å]ÚäΉecm°+°ö˜ë€}» -+®Á¾‚}ûVŒuÇzb½±¯cßľ}û>öììÇØíØØÝØO±û±Ø@,€ -Á*±aØpìaìçØ8l<6›ŒÕac3±YØSØÓX[€-ÁžÃžÇVak±õØ Ø¯°—°-Øvl'¶û-ö*ö{ìuìMìö'ììÏØ{Ø_±“Øß±3Ø?µýo]ŒSk²änÓJî.érdé;[]j'ë‰Ë•£Ýb d½Pâòå(hÛ²š¡s‰Ð¹Dè\"t.:—K„Î%Bç¡s‰Ð¹D.iç[78æiöO¸ßlœÉùæÉ€šâèòºÅWÅ”DÇ\0¦{tÎczD׺ĸ}[¦ñsαód¨#†U^gÄîÜÉ2u5š®Å®_;“sý”išeåEåý+«‹ÊýÃ*ÊÝÆâL9~tò¤Ú¼cOóJ6ùFªŠw‘±WJ5î1YUz5Ùw½-L³óPKW}†ö˜ l.PK×.f8-Pictures/20000262000034EB00001F51157CDFBE.wmfµÛ œNuÇñÿ93ÌÓ í$©V -=Œû-÷KƸæ¶îÆm4îŒ-·<²R$—Qd%‹ B+¤)”lÙVmh)µ•Ýfÿç<¿çó ÍÖ3õz×üÏûüæOÇ9ßç÷†*¤TÔw(UX%*ç¿h}D±ª€þZÄ|ÈP¦³ºÅt®Åêãg½2ÜJe:µôIŒþúíÙÙÙfp‡ -†áîPÈý>ge˜ÎUge†Xðªóë^1¿Ën:Ûý.: Jï7²tJ¿ŒÒ톦÷¢6ïÝ—±S¥wÈPÊ'¿ŽéîTÑ(áùû‹’ߟ¨|_4ÕîÙ¡êî~¶y«JrW–c$©ÐN×Ö¤P“âY“FMšgÍTj¦zÖ,§f¹gÍjvxÖœ¤æ¤gÍ÷Ô|ïYSÜÕ7¼j*PSÁ³¦5-Â]LUÉ—`4‰|—J F¯Èw©œ`Œ‹|—¤c~ä»TI06F¾KÕãhä»TK0ÎçßtQã¾ß»¦ªì»¤"ß%É÷a>ìRÅ·5v©ê[’»Tóùóa—ê¾ù°K -_r>ìRÓç‹`—Xw—(ý®ó©ÛÕ]×ÝçÚçwp夡Ð*|5)GâÊý@A¥¿–rÿ_â£cKFè» -Î/]L÷FP-ÕÕÖ=êõA÷5ÅÊ«ú®|Æ ¯,s¯j-¶Kµ{[V¶ù–j'¶UV¶¹IµÛ¨:ˆ­SŠ­UÅV«Nb«de›+Tg±—U±¥ª«Øbõ±ª›Ø‹ª»ØÕCì9YÙæ,ÕSl¦ê%6Mõ›ªúˆMV}Å&©T±qªŸØã²²Í Õ_l´~m¸¼,s¨$6˜O‚ij°XýÞ Zª~ÿ­·&ÖS -ë¦FŠuU£Ä:©1bª±bíÔÅÚ¨'Ä’Õx±–j‚X35I¬©zR¬¡ò‹5PO‰Õå“iõ´X -5]¬šzF,IÍ«¤f‰UT³ÅÊ«çÄÊ©9beÕ\±{Õ<±2êE±RjØj¡XI+¡‹Ùê%1KV¶§^‹ÓÓBögì5ì/Øz,ÛŒ½…mÇvaï`ïb°÷°#Ø؇ØIììoØçØ?°/±sØìööoì'ì¿X6e„¬€²BØ-Ø­X«â\½KÀ~‡Ý‰Ý݃•ÅÊa°‡°$¬*V«=Œ5Àš`Í°–X+¬-Öë„uÁºc=±¾X?l6Š -ÇFcØØxìIÌ=MÇþ„=‹ÍÁ^À`‹°¥Ø2lö*öö:¶{ÛŒ½‰mÇÞÆÞÁöb°¿bG°÷±±ãØ'اØçØß±/±b°‰…; 1ÒYˆU¡Äá|-kdg;•W?¥£õS¢°{¤ëuº{¬Êý©^T_·Ü#]¯ÓÝó¼êãõõD÷H×ët÷<\cO}§SyõÊyjÄ -cE°8ì6,+%b‰êÆ^Çpç&t½ Çï?÷¤çœ•ˆ>£ÓÈ':ÓÏëçí<ýÊÏlµR¿®K9»]'§bFèì²>»`Ü\~:M~:M~:E~:A~:®SgÐ> ?½/©É6ß#+’•mî'+í“„d›»%!YæNIH¶¹]’¥“Y7±Íä¢LIC¶¹^Ò¥“Yo±5’†,ÌúŠ­$­ -“÷˜¥“Ù@±E’|,s!Ég¬lsžd Ëœ«›-ÈÒ-”†ž! -M' -MQ#Äü’‹ls¢-6AV¶Îhbcee›£HH#ÕãbC%+Yfº'6H²’e 5¥’šúÈÊ6{¨ÉbÝ$?ÙfÉO–ÎhSÄÚK~²Ì¶$©V$©dYÙfsÉTN2›I2›E2 ¥«º¤«Ú²²Íêêy±ª’³l³²ä,Ëô©ÄÊKÎrú§¡ÄU–ÄuŸ¬lónµHì.É^¶™(ÙË2ïPKÄâU(……ò˜s¿ Í+âÔ+Ø*l5¶[‡mÄ6a[±mØNl7¶ÛÂcÇ°,ìö1vû û;‹}Ç.bßb?`?bÿÁ~ÁLž7Ñ<ƒb±ÂX±kR˜c6Ý%b¥±2Øï±û±òXE¬2V«ÕÂêaõ±ÆXSì,kƒµÃ:b±nX¬–Š -ÄÒ°!Ø0l6{‡MÂ&cS±iØLlö<6›-Ä–`/a¯`+±ÕØl¶Û„mÁ¶a;°ÝØl?v;ŒŲ°°±SØgØì,övûæÿÈ^Áç÷Óê}·ŽV¡3[ŸåìN}ƒ©ÈO*ò“Šü¤"?©ÈO*ò“Šü¤"?©ÈO*ò“Šü¿I* -Mè gÀ능¨÷u6ÉÒ_ëô”åž«rÏŸiú‰˜®Ÿ{ijšNSÜó¼ê—»1çyátÄâÜó¼ê‹»1瓦Ó‹sÏóª¿èvÄô½ØíˆÅ¹çáúÜS]¬Ç+YHþl²HuY¤ºc¤ºÃ¤ºC¤º¤ºwIuïH/Ì2w‘ê¶K/Ì2·ÑÛBl° -tÀÖÑ[Cì5:`¯’ôVô–‘ô–’ô‘ô’ôæIßËÉh¡¤7›n×,º]3èvM§Û5…Ìç§Û5‘n×Y9m(m˜ØhòÝHòÝPò]:ù.|7Xª¤:ËìK¾ë)©Î2»K/ÌÉhÅ:“å:H/Ì2ÛÉ{Ö6[“åZ‘åZåš“å“åªbõèŠÕ%ËÕ$ËUWÏŠU‘þ˜¥ÓÚóbÉmåÉmå蔕%·ÝCn+Cn+EnK$·•”´f™ úoYÐ,µL¬¸¤5›´æ>[°ÕØl¶Û„mÁ¶a;°ÝØl?v;ŒŲ°°±SØgØì,övûû»ŒýˆýŒý‚)žUÑ<« -b…±"X¸g^ÝÆÕx¬–ˆ•ÂÊ`÷b÷c`1V«†ÕÂê`õ±†XS¬9–Œ¥`í°Xg¬+Öë…¥bý±4ì1l6ƒÅÆa°ÉØSØ4l6 ›ÍÅæa ±ö¶[‰­ÂÖ`k± -ØFl ¶ÛíÄö`û°ƒØ!ì(v û;ÂNcg°/°¯°¯±o°_wÏb%¿ºîYŒ¾ËÖwµ}‹v¿.Èó駯[º.ζÜó¼êKêëÎ]³¤®w¿æ¬¿±t 'ȉrb€œ 'ȉrb€œ 'ȉ\rbó“w¹çÅØß$7q_Éh‹~Ôéçq×¹½ê¡Ú4}O×÷óúH“{½Wírýl^¡³åR},÷È–¡ÚâF'»ëœØÝ]çU{Ѩ®sb]ëºëpíÍeÄ+dÄ+dğȈ?H2´Ìï™’^¢Ëw‘‰èy²ß9²ß—ä¼³ä¼3L5?gªù)ÌSL0O’ߎ“ß²èÔ…WÇHmGHmïÑ•;HWn¿d5ÛÜ+“IËÜCBÛ)¹Ì™‡Ú[tÛ¶ÒmÛDË$­§³¶ŽÎÚë’Áœ„J^«H^+I^/“¼–Ñ1[BÇl1óȤ¬ùÌ#çÒ›£æ‹=K¢šE¢šA¢šN¢šJ¢ -¯¦È<Òù”÷ªØd™GÚæ“’¨œ)óZ±‰’¨œœ¼Qlœ$*K¯Þ{Bæ‘Î4úm±±2´Ì µWl Ùj ÙjÙj$ÙjÙj8“ÉaL&‡2™Lg2™Îdr0=±ÁôÄÑHOl=±þ2£´Í~ü¼qªÌ(mÞ¯ˆõ‘¥3Wòé%Ý1§ÿZP¬»tÇœiy±nª¨XW~^¹«²ÄºÈdÒÒ«’be2é|.¸K¬“L&~î}X9±ŽêA±Ž2™t&ò•Ä•É¤cÕÅ:ÈdÒÒ«ºbíe2iéU#±v2™t>´k+“I§œ‚…RVRVRVRVkRVkRV -)+…”ÕŠ”ÕŠ”•LÊJ&e%“²Z’²Z’²!e=BÊjAÊjAÊjAÊjNÊjNÊjFÊjFÊjJÊjJÊjBÊjBÊjBÊjLÊjLÊjDÊjÄŒ²3ʆÌ(2£lÀŒ²3ÊúÌ(ë3£¬ÏŒòaf”3£¬ÇŒ²3ÊzÌ(ë2£¬ËŒ²3Ê:Ì(k3£¬ÍŒ²3ÊZ7™²BÏÂ}*¬ï8Ñúˆ‘»‘×sÓùüg麢úˆ»NmI}=Q×Åë£äUµ7öLÍ$Ye’¬2IV™$«L’U&É*“d•I²Ê$Ye’¬2ó5Y¯‡ÿULУÜ_!?~=çN¡Ÿ²ë“áËî«ÿÜÂWr«©”=îº5•³_¸nMRöZ¯Ÿ Ìù{.äîS@õ=bä¨ìà=<¯*W_ ¾~EÜB¯Ÿ2M³UûÒí{Yº}¿ƒúë{ŒÃõQâü×êÍ]û2B’Wý[ N¹Á?)•3sUÉÕ¼þ•“ƒQî÷üPKˆU\ Å -f5PK×.f8-Pictures/200004190000356F0000214816F2BAAD.wmfíœ tU†oU«H·£ÑÁ3Îx&ã’•£(›l²Ä°(¢l†%B"AQTŒ "(¢¸ÃEDÙ÷EAv‘ (ÍÜ÷êÖß t51œÏ©Sï}õç»;}¿~uƒªµŠ$ªJ¤þ æ#È¥>W7!¦U3ÕµP>~å‘¡“dªì -<©ÌçÓÌ‹ŠŠLk… C¯PE¦ºªF¦a³®ªïûóx‘µèÃþW´ëÓ/u@Ö©ƒëܕѯ[:Í_µzðR>ê,]7˜(J¾©WºÑ¸Üñß$ÿ>¡òuÁHëÿŠìtˆ^Ïm^B‰zä2¯0É^éÌL -2)Ž™ d23/ ó‚c&™\ÇÌ -dV8fö ³Ç1ó+2¿:f ;f8eb‰qÌ´F¦µc¦2}3Ñ„Ì$ÇÌ"d9fv"³Ó1s™“%2?2÷ÿÚS¯8ß_ëÍœÆëó49eö ³Ç1³™¥Ž™ÉÈLvÌ Gf¸c¦2½3-iᘹ™ë35‘©Ig?þg¾ûœ(ã»Oñ•Ô»Ì5!EÕŒ4Îx÷³FÅß±Š_«Dó*w¼J ¯’ð*±¼ÊÈ€W‰ãU¦¼J<¯²<àUêò*»^%W9ð*‰¼ÊeF «ÔãU¢\Ťè¨H£Eà«DG©¯i |•ØHc|à«ÄEù¯il -|•º‘Fa9<ÓuŒÈ_»&ÅD™å°JlÔ -|•¸¨Õå°J|ÔôrX¥nÔ å°JBT¿rX%1ªm9¬R/*&€UBõ*Aüª‹"7]{ÎuŠûwI“²GÞ«‰¨ø' -ߟ*QŸ¯Öÿ/aÁW?öWU2Ô·®ÉǵA!Ô–6S}ìàñ=·Rö'–’ù¾4‰2õ‘Ëã\=÷—ŸÂŸfèãa?¬çþò.£…ë£5[빿ü1ãFúEq<ŽÓsoÞzlÌ3›ÊŸšBåQÝ*Ÿq¼#—ù9µö?VóPGaèa먓°UÔYØJºOØRê"l1uö1u–O=„Í£Tas©§°¨·°÷©°™ô °üLXl¥ ›Š‘ý¨»MõÌYl" -6 Oƒ…½I {ƒö=)l=%ìezFØ.ìEzNØhz^Øó4ZØsô¢°ô²°á4VØ0zMØSôº°'è-aCémaRŽ°Gh¢°A4Y˜zY,Ÿ!ûÓtaÑ{Â2è}aé4GX?ÊÖ—{>–F‹…õ¡¥ÂzÓJa½hµ°ž´NX*mömÖƒ6 ëN[…u£íºÒ.a]èKa÷Ó^a÷Ñ~aé °{é°NtDØ=ô½°»©PXG:.¬ý,¬=ÖŽN K¡ß…ÝE¦¼ÿ$S°a±¶*¬ -UÖšjkE—»“z-Ö’.Ö’²-Ö‚®Ö‚þ -v°æôwaÍé:° k¦ßkkFÑ`±ÂšR‚°¦TOØt«°;è6°F`M„5¡æšP añy½1µkÖAX#ê$¬uÖº -kHÝÁz -k@½…5 ¾`éÂn§La·Ó@°G„ÝFC„ÝFO€=%¬>=#¬>v+v+6VØ-ôš°[è -aI”-,‰&€ý[ØÍ4EØÍôØ aõh–°zôØ\a‰4OX"}¶PX-–@Ë…Õ¥ÕÂêÒZ°OÀ<Ââi³°xÚ",Žv‹£]`»Á¾K_ ‹¥o„ÅзÂbèØ¢©P˜÷ÓweùôJvUVç댢"•,YÉ‚)žªê#‰ÇIzn¥|W¾|Ý¥$'鹿|_ÐG“ôÜ›/]eT»‚%G깪V¬:X-°Ú`a`—ƒE€EPéGïî†}½’ÿ߷ -©ÙåÁ;¹Šofï±f¹\'r-µfƒh&WÎ)2kCW°¸ kO§Ø5ŽÊ1Ö—»c<ÇHõá½ÏrŒéÅ£Ì"fÑf‘)l<Ì"»˜Y f;†›}Â6‹Wac)K˜ínö Û,FÁ,FÒ¨³Ìb8Ìâ˜ÅÓ4î,³êÃ,†Ð„ófs0‹U˜Å¶2›Eg*(³Yt _Êlm©Ê5‹HXÄõ0‹(°˜E]˜E"Ø-°ˆú0‹†`aÍ*Ìâ¢2‹%0‹e`«`k`À>…Yl‚Y|‹Ø‹Øù?4 «:µ§jÔš™=só¬fWñ,¬”5?5?5?5?5?5?5?5?5?5?5?ù¼Ô|û­b^Ã)ݾHŠÞQµYí‰lÕs+åÛ®2HU½É|žÆUr²žûËçê=UCTEÉÔsù0½'Ò’ÏjO¤¥žûËŸÔ{"Ñ|V{"ÑzîÍûv–P‡G²J…³T8K…³T8 U8‹Å*œ¥,Î*»J)vC*S/6‹4>÷ãTšž[)ßõ®_wq®çkè³ÿ|8_à\8çÃô¹x¾tõ0 -f”3Jƒ¥ÁŒÒ`Fi0£4˜QÌ( -f”3JóaF¾GÕßåÛBÏ‹)U×d0›À®ü…lI…zìëQ·³4›ëì|®ÉóõØ_6—bCĵkûˆÍù´ -¿Ã¶ÑcÙ“ÆMlFñlEñzìÍ–ÍŠŽÂŠŽÂŠ¾ƒ}Kí…ˆ¹Í¯énaûÄTßҽ¾?r›;è~aÛeäfßê*luæ)}SZ‹;H«qiLiî -‚)-”‘Û\SšSš#π˜ -SšE…½Çk±ôˆ°wèQaSå’2¯¡Â&Š3¹Ì&,÷’Þƽ¤×aO¯Áž^AïàXñ(uÏiŒ°ÑâQʲ^eƒe½ËzCØ0ñ(—ù$ö8î/=F¶Q=£££Ê„Qõ§waY³„eЇÂÒaTý`T}aTÒ"XÖa}ÐãØFÕ FÕF•JXÖgÂzÐaÝaTÝ`T]aT]è+XÖ>a÷Ñ7°,Û¨î…Qu‚QÝC?²Ž ëH?Á²l£j£j£J!C*F -IÅH¦Ê°,Û¨ÚÀ¨ZèZQmX––u¹°;é -XÖÕ0¯:°¬kaYÿ³ª9Œª9Œª9ŒªŒªŒªŒª)Œª)Œª)ŒêÕ0ª&0ª&0ª&0ª&0ªÆ0ªÆ0ªF0ªF0ªF0ª†0ª†0ª†0ª0ª0ª4–õ(,k(Ø“°¬,XÖp°çaY/À¼^{–5–õ:,ëmXÖx°I`“aY¹0¯é°¬÷`YïƒÍeåÁ²òÁ>†eÙF•£J„Q%À¨`T 0ªº0ªº0ªxU<Œ*F£ŠƒQÅÁ¨baT±0ªXULÊ®{•ù·*àÄ=¶¾kd-¾îâ\ ->j#Î×#8ÆGx‰léêg,* •‹Ê‚EeÁ¢²`QY°¨,XT,* •uA,ª´7AF}T1ÚêÃzßsî¸9ÂW…<.Ôsù)´™½I;x¼CÏýå]Æbv'u¬äñJ=÷—?fÌfRÇ|Ï×so¾lwÃ*)gŒ\fˆa;”iؾd¶/ýŽ]¤ßàF¿Š¹ÌSbDnógxÐI1|·yŒ}ßb…pžÐ+ãçq³ÏÙ¦s¦sXüÆÅŽgï `Oè ö„¾ÕàŸ‹í§‘Âö‹Ë¸Í½ô’°¯`0»±ÿ³[úbÜæØÿÙEÙÂvÐDa;¤Ëmn£©Â¶Ò4Œråêš)l‹ìÿ(·œ-ìsÙÿq››ÙÔ-¶™ò…m¢…Â6ÉþÚý[.ì3Ùÿq›i­°´^˜Žâ£| -GùŽò eev}Öc×g=v}Ö¡f}'l-¶FÌÄÅ£ÂV‹™(G>ö›°UT$l¥ü„ªËy^!fââQ5aËÅL\<ºTØ2Ùëq•ýW¯»JØRÙõQ¿ð7°ëÀþ vØM–HŒ‹Gñ`õÀ’Àn¶˜[,=0Š5k Ö -,YØ"J¶ˆ:‚ÝvX°ÂRª°…øMþ–Ö_ØÇô°°ÅQ{ l(Ø0°,aѳÂ>GQl4ØK`¯€–Oo -ËGQ,lØT°\a h¦°â(ŠÍ›6_Ø|q7-[¶ -l°yâ(jŸ|#Ø&°­`ÛÁ¾–'ŽâæÑ>°¯Á -À¾6—¾6WE±ã`'β•?Ö -ó&W~uäð8GÏ­”S7Ì›l,êÈáqŽžûˇñõ}äð8GϽùÒU­l˜K6Ì%æ’ -sɆ¹dÃ\²a.Ù0—l˜K6Ì%ûwÃT5:ò»Ý -SHè0ºavrÍØŒn˜Uüùj1ºaÐ)ö€²vÃVÿí»H¾êÿOÅ꿽Rè£þ-VõíÑ÷èš="½².®úvýÿõÿÜRõÿ‰³êÿbõßÞÕØ/{jÈ®ÿ_«ÿcPÿ_öå9꿽[Qúú?õÿ]ÔÿPÿ?DýŸ‡ú¿à"¯ÿöÅ:ìQ¬ÅÅZÜõYƒ»>kpק¢þWÔÿóSÿg Ö¿ ö؇`óÀ ®/D­_ ¶l%ØZ°õ¨ëÔúÏÀ¶€mÛ…ºþ%jý^°ý`Á}‡ZõÿX™ê¿UCò©¿ïØ=+ùäæY -Ì®âYi{VòP™óP™óP™óP™óP™óP™óP™óP™óP™óP™ó.žµ« *¨ÚUPgÿ; \Û3IU¹¹Æ¯çþò¹zWAÕµ«°UÏýåÃô®Â2>«]…ezî/Rï*Ìå³ÚU˜«çÞ|ÙîÎT˜E…YT˜…Å*Ì¢Â,þ?Íâu–làúïáó&NyôÜJ9u–l çjq¾†>ûχóõÎ…s>LŸ‹çKWµ<ðüÅñÀ_<ðüÅñÀ_<ðüÅó'è,¹„}æ2v™ËŒytî,9Î.sŠ=æ”ûËæ»;âä0ÞÎï'ñv–x‡»Ô†»Ô†»\ -w©itVîRÅ°Ý%Ô°Ý%Ä°;F‚ -»cÄ0ì>Z2ì>ÚßÐrÝ!¿ ägt‚œDÏì üñ1ôÌJÿ‡º£bÿñQt}‘^uåia‡ä®ˆ²g…D‡Çù½aÕ5cwxìCì^ÜÙƒþØÝ°˜/`1;ɾ?²Ó‡Ål‹ù³»Ëtn¬GçF…»\lîÒì~°îp’à)½ÁÒÀÒÁ'Oö8ØS`OÃIFÀIžö"ØX°Wá$oÀIÞ›6l -Ø´ -w)£»x{8pí?̉Ãzl%œz8°·fg9¬Çþ²á|=‚sa|„—È–®RÀW -à+ð•øJ|¥¾R_)€¯ÀW -à+åê+Öuï_n´xþåñWÒŠ¯dÿ%˜îƒ£Š¢ùyó^ñ•‰.jqÎLLQsfb‹÷› æÌà¨qçÎDÏ:w&f͹3±{2Ö#vö_Ó)þVÑë„P÷‡3 ,ªoXÝ€þVºÑ(yÍz>«ë•ìç“LÓl•R'¥[ú€:)©™}zÒHÍ+ñqçáÔ¿lõ`û•Uâï’×e­W7]\%¹êï/ƒ*¤¿æ¿PK³Âž‰šTPK×.f8-Pictures/200000BB00002F1100001DFBAFB5B668.wmfí\oˆUE?³²Ä4Ü0!ƒÝ­¬5SY%wÙ?¸¡Rd›D¦°Q«¼ -I£4×V’ØbA¢?ä—]PB00S,7¢4j—óKôÉ )ƒòC` ÂvÎÎ9Îy÷¾?÷²÷ú&¸‡3ó;3wÎ3gÎÜ;÷=9piÌ4W¾c1Àµ{êW=¹ÀÀ– -WÔ@~Ç6Hob~M@6®£Ê·qYÚ܉ùH·#Íæ<©Ð€t+äË@šËrJüýï$¿_µ›4 Õ„ZÕïÄÄÄz$«FZ‰tË{°q½±m#N˜ÈˆW)¹\oÀÛªkk‚IëPSF‡R}‹\Ýû -LıŠ¢”1”6{™jV¥p¡ùJžÔÓ¡Tß"i±÷soRßó‡Î»`l†°¥€NY²iXÛÌešÁ¸ØŒÆø¤!¤%HÏ#½„ô -¸¹ -JFë­)…æA/Ò:Ø;&mR«áq¤§&× -²á-L2W§)^ þøÎ °óP|_°*Æö*~BÉ“ôB:”ê[är½éJº·Ì§’KQ}ê-¤eH!mDºù>%2òb>õR¼ -ýÊŸÈ_Èj¡´E‡«w~š‡ ‘†‘Àƶ–±¨>K}$ï³í`}aÒÒ ë/ù½¬çH NT½©Ï4ô&??ˆÔté]n#ØAÆ.+ޯ䙟§Ÿ¢úy/X»¼ƒtéÈ÷s‘Qýb~N×ÙŽ–ÝvevN?Eµ3Ù—l9 -a;‹Œ°bv^‹ôBàú™mÓKq|ø$XûýaÛŠ¬œï@~\|Î|øæ¤8>Lö%[žƒ°E–ù°?)ªmi k¿?!l[‘‘-ŠÙvÒNÈ¡EޘܳÓÞ\ž[«!Ùý5íM[Àî¥[À½ÿИûÔÃHÍH‘:¹`‡»¨x³’gþ‘~Šã>AjCúé1È÷‘eûT?SœGö%[ž‚°E–Å8RTÛ¾†DoRÈ~¿Aض"£x-Æm -Å8Ù»&çzÀÆ´pqNc>Ĺ#@ï¯. mâ6‚aì‚âë”<ó‘ôSœ8÷)ØóŠ¯!|–!²,Îù™âÄ9²/Ùò;ÛYdYœó'Åy–#›’ý~…°mEæ˳‹ŒƒgãàÎJ4æËYÉ·`ÏA΀;+9òq.ë:>Äæ£H§‘Î#å6‚eì¼â§•<óëôSœØüØ÷l§~†|¿Y›ýLqbó)°¶ƒ°E–ÅfRœØü=XûýaÛŠ¬\lÞ¦b3Å!›k ÙØ|]QUÌ—ØL_6QÜ5ÆÅfÃßû\ç²®ãCl>„téáü½’`‡»¤øU%Ïü:ý'6“]h¦|A2“ï×"Ëb³Ÿ)Nlþ¬-¿‚°E–ÅfR&›’ý(m+²r>܇֠ß"Ô‚[ë3;§Ÿâ~Ç@¶¤ï‚vYæÃþ¤8ûk²)ÙïwÛVd¾ì¯åýVqツX}Ñ÷Ò{^´›¯[ÍظÂv›xgJiî雌}—¶Ü¸÷m’ob}—ê$e—xF;w b>Œý–j=òýÆƯ•ßÃzîÔñAӘÒ[c=\îU¸Ïk Ÿ]wÎ)ØÆŽ(¾Nɳ8‘~Š'h?hì9Ù)xF"2²}©=@^¿’Z{ÈoéûµQã¾m b¾øðR°þÚ·ká²®ëƒû}Ý1ã¾Él˜±cŠ7+yæÃé§8Ïk#Æ~³sÜ„¿çY¹ç5òá­àöxIù2í¹úÙö1¯.€í øt{JºÞ½jýb>¬¼&,Që‡ÆZ¸¬ëFÕ;­ß¹’.9c×þ>ä/³Þ9Î÷ñÞEê׶Zw±íÍê»Ø\–ëïc^]“=gR}þöz UŸòÝ[PæÃœ~ˆ÷ª­j_«±.÷*£ ŸÛÖÆØZÅ·)yR¾YHÉ·).utÝJ!Ùþ cÿ‹…tâû’<ÉÞã²®“”oN¥ïJÎ;z.¡ÿž ³£Ÿ¸`uŒ5)>ªäIÍ»B:H¾Nq©£ëVz Éö÷wþvŽïKò$;Ëe]'©y7•¾+=ï®°NÓ›wW˜Ö¤ø%OrÞu|âRG×­ôŠí -O­q¶§<ɪY¦ë$9ïâöÝþ=ƒÊ; y΢ròz^£g1Fÿõ5›ew1Ÿ§êîb>P†r»!¾Î_wˆûT:UúÔç±Iëôa¾~›qï ƒ˜û\×EÆýGäeLêè¹%_lžÍäz”æpþ?PKˆÑIØlXPK×.f8-Pictures/200000AE00002F1100001DFBD4204EDD.wmfí\oˆUE?³oWk±-Ú¡?èfÖšd¨ä.î.n¨Ø&‘m°Q«¼)£ÖÒ6#*‰ü_ôƒ``¦hnDi”Kˆù%úd†¤Aí‡À@¶svÎÙ9ïÞ÷ÞÞËÎÝ7Á8œ™ß™¹sîœ9sæÞ¹ï(‚Kg -À<ãÊ·-¸q7ÀÜÕO¬0põi€uõPš†±M Ò›˜_‘5ÒuTùf.K›;0? é¤Û9O*ÌCº Jå÷#Ía9¥«ÿ;ÎïSí Ý…„jBƒêwlll¢É -H«F¹¼ Ï5¶`Ä ñ:%—ëÍxçum­C4iê'Ñ¡Zß"W÷>¡ƒI8VIôO2†Òf7SƒÂê.´@É}a%ªõ-ò§Ö{?×ñ&õ=âü¡¥`3l€—Ëè”'›fƒµÍ¦YŒ‹ÍhŒq÷BziÒKàæ*(­´¦”›ýHk Öáçbîq¤'a|.·›ÉTˆðŽßœ;Åï«cl·â'”ܧߔӡZß"—ë5*èÞrò—’úÓÛHËþBÚ€tJýIdS+ùÓsHÝð - *oi€¸5@úy¸fû·±y¸iÒN°qm'Ë¢XRŸ¥>üûlX_x i?Ø5¬^åw³žû#u’êM}f¡7ùùA¤A¤kHïsÁ2vMñA%Ïý<û”ÔÏûÁÚå]¤ãHC©Ÿ‹ŒêWòsºÎV´ìV°ó@(·sö)©‰È¾dË!ˆÛYd„U²ó:¤"×Ïm›]JãçÀÚïGˆÛVd“ùðèÁ/‚‹Ï¹OOJãÃd_²åˆÛYd¹‡“’Ú–Æð'°öûâ¶Ù¢’mŸEÚE´Èëã{vÚ›Ï`*€ßý5íMÛÀî¥ÛÀ½ûÐXûÔÃHK.#uqÁ3vYñ%JžûGö)MŒû iÒWHA©ˆ,ߧ†™ÒÄ8²/Ùò4Äí,²<Æ…“’ÚöU$z“Böûâ¶Å«d1nK,ÆÉÞÕgœëÓúÀÅ9…çŽ ­Gº„´‘Ûv„±KŠ¯WòÜG²OiâÜç`Ï*¾ø9†Èò8fJçȾdËï!ng‘åq.œ”æYŽlJöû -â¶Y(Ïrt.2 6ž -ƒ;+ÑX(g%ß=9î¬äˆ¹¬ë„›"AºˆtžÛv”±‹ŠŸQòܯ³Oibó`ß³FúJýZdyl3¥‰Í§ÁÚò,Äí,²<6‡“ÒÄæÀÚïWˆÛVd“Åæ›)éØ\~c󨢺2X(±™¾l¢¸kŒ‹Í†¿÷å²®Bl>„té -áü½’`‡»¢øu%Ïý:û”&6“]h¦|I2Sê×"Ëcs˜)Ml> Ö–_CÜÎ"Ëcs8)“MÉ~ƒ£¶Ùd>¼ -­A¿Ch·ÖçvÎ>¥ýŽlIß1Dí,²Ü‡ÃIiö×dS²ß·­ÈBÙ_Ëû­fãÞ}E1}Ñ÷Ò{^´ƒ¯[`lXa;Lº3¥,÷ô­Æ¾K[nÜû6É·²¾Ë#u|ÙåS‡!ãÎÝ¢XcD¿£êE¾×ØøU¯ò»XϽ‘:!è}Šu:«ôÖX—ûÂóÚÃg—Æs -v€±#Š¯Wòc¿¯;fÜ7y‚ícì˜âK”<÷áìSšçµýÆ~³sÜÄ¿çÙdÏkäÃ[Àíñ|ù2í¹Ùö0/”ÁvE|ÚÇž’®w¯Z?¢XëG ¯ «õCcm\Öu“êÕï\I—¢±kÿ6cë[ÏØ&ÆúTÁÓÚVë.¶®¾+Íe¹þæ…2˜ì9}õùØë-R}ÊwoQYsúAÞ«¶«}­Æú¸Ü¯pŸ~O¿×l2î7§QÌg_DôŒªÿÃAcµöUŠõä Á®¹«¹`EÆ_¨ä>|¶šÕúy­ÇPÖœN䛑¯·æ¬d¬KÕÜçz—¶ïy`¿WªåØ­`îûÿ0ϨÍ./Fþ¨¡ß¨ÜÊŸe,kgÞ¥ê.eÞ6 ïävÝ|n¾n7÷Ó©têd];˜w1oáûÁ{Óÿ[3UÛþŸÆFÆd%”Ω©®Ÿ¢O¯q{´(B<{†Ç•|Köhkã²®[ë5kÛµyòÍÜF°vÆzïQr_ë~%ªõ-òZa¸= ùJ‘ï«ó„mTu÷µîOGß•|“lBû´^ãÞýF±P|“öEãöšëãr¿Âk=¯È/h/:€|>ò¸`MŒÍW|@É}ùf9$ߤ¸ÔÑuk=†dû{Œý/zžÿïKò$û€ËºŽ/ßœJßµœwô\Bÿ=AgG?sÁškU|HÉ}Í»r:H¾Yq©£ëÖz ÉöärþvïKò$;Ïe]Ç×¼›Jßµžw#¬S£qón„9a­Š(¹ÏyÕAòÍŠK]·Öc(¶7<> -ÆÙžò$+°L×ñ9ïÒö­Ÿ—’ä+=k5q=J³9ÿPK\Ýn€èTPK×.f8-Pictures/200002180000355500001F51E30B6F10.wmfíÚh”÷Àñïóä×E“šš—°¸¥¸Q¤¨‰6¦¡ŒQÆ(ed¥ÉºÎ–¶Óöì¥éEbt™¨î´6fšþ˜ëmê2#Nl±r¨´b­Ø¤ˆtb‹ E¤ˆëÄJRZ×Ûçù>ßç}—ìžKðì'<<ßïëû¹OÎç~|>÷½³T±Ry -A¥¦¨ZåüË—#Ï -¨9—Øs­|ÛMµµ€ÿ”‘¥#•íÄΖI‘œÿ%žH$l7ÃlËÒŠõ휑e;«Îȶ,cîªów¿¶GnÒ—,ï^ü´=ê®ûI¨§®uidQ§:|꽞wä¨{g¨G©zówliŽUí{ÿòÌý3jn—O´þ—ð¢ t¾ -{šjÒ£r»ÈjR^¦ñ1­Ä´úÆtÓ鳉˜M¾1ƒÄ úƼKÌ»¾1ÃÄ ûÆÜ æ†oL¥åÅTZ~1 -Ä4øÆ´Óâ&&쳞˜õ¾1»ˆÙåó61oûÆ|DÌG¾1£ÄŒŽ‰ù\<ósÏyÆ¥¿m2fˆççò‹é#¦Ï7¦…˜ߘäkašúïÿËøWòèM¾’S39¯Ø; -,U[ÐZ0îÄ¥¾úS%]–ÉòPÖYæI–HÖYæK–Þ¬³Ü-Yöd¥Q²œÈ:ËÉò·¬³4I–¯²Îrd©°²ÍÒ,Yê³Ìb«†ú õ@öY‚ÖÓÙg™´ÖfŸe~ЊeŸåî u$û,Aë¯ÙgY´>Ï:Kó=¥Ö¬›~ît–|É2§ñŒªËò5 ÷¦ùeu îMóœÆ¶,î›'O^õ•jæ„yÆW™dýóFÉÕ¦”›¾ç+Tyrþ¶¾&Uùë Ë»U¡åüéÛäøn^zP½¨ÖÇoÑs7ÊëQÇÆw¨ÅªKa‡õ9@×Ð:nTn÷ª6c/¨ŸÛ`Fö:µÐØZõ¨±Õêqc«ÔÆ~¥~aì—j‘±nõ´±.2Ö©ž1‘kæZ»\k×Âê9c!µÔXHÏV`=Ø*l -¶‹b±^l3Ö½ŠmŶc;°Ønl–íeu?v;ˆÂcG±cØqì$v -ÂNcg°³Ø9ìÀÎbbç±±aììö)vû »†]7–ü¬Vd>«”WóV"áDŽ­(ùòÞ;EGôÜJ_Je½\Gô-;;}zîF¥ï:õBHÎÎBHÏ3Åê„œ„žgŠ¯Ô;Îûž³ƒÒóLñ£z!$gg!¤çÉøôEÀçJ›Ç&·‹ ßó°Ü.BnÁ±Ü.BnÁ±ÿ½]„€©¡Å“ØE(’÷±)ò‰¨HÞ»òõy{Æ -T&ëåW&ñ¥úœ9¾FÖk%®Fâ«ô95~r*F¯£W‰Ñ«ÄèUbô*1z•½JŒ^%F¯£W‰¥éUÒ_Gç)é{–À7Ò»”è+™/µy—ô.ƒÒ· êqº«îÅvJ_Ó%=N‡>=Ž;˜ò­‡_¿âÅV¦|ãá׫x±£)ßvÜŠ>%·’Ûq-·’ÛÉ퀘ÏØÿÇÈdz¯Â©7¥ö‘ˆ#zìF¤¯Fe²^.q¥r”M[#ëµW%G͘ØÉUª8ýJœ~%N¿§_‰Ó¯ÄéWâô+qú•8ýJœ~%~Kûw=ù‹`×óô_¸¿LÍäýÞdqO}â)yÜ’+éb«'Œ™—Ø:aÌüÄë>1~¿‘I½ÏÅ:OZ¼bY÷òÄ]V‰5Q¦9ÖØ5÷ú•èLÞõS¶m·´Õµ-êì®k -k_¢6i/”£úWGO¼×ã=’c~‡ª’½£ûH©ÔÎ’UeV3ýÂÛÁ<}›ÿPKõ -üê3b.PK×.f8-Pictures/200000A400002F1100001DFB1A0425AA.wmfí\ohEŸÍ{¯µ¡>ÅH)ø‡$Æj XHÅš£1¨ÄKŠ¦%RE#6ÕÖˆ¥"*B -ôƒý’@ó¡P!Ö–j#¢©h‚”Ú/â§Z¡R´‚öƒ¡âLv&7ïîý¹#w}+ÜÀ0{3»·sûÛ¹Ùw{÷ ‚G3 ÁxÇ7o¸v@ý#uÈ>°½ …4‹m‘_ÇòVŸ­–ΣŽWñ±´¹Ë«‘oD¾…ËäBò -Ph¿y-Û‰þøûßEy·j·ùvdtrªß………¥zdË w"ÏóñAl\olÑ‘$ØHÖ(»œo%À[÷ªskü¤}ÈVð¡\ßbW×¾äƒ 9Vaü3†Òf”9§t5J/¼NÙãÃR>”ë[ì8­a«±×3‡©¯ù#/;`^€ðRŸR²´,6k™W³^0£1~ùäûŸAÞ…ü"xs”îtO)6» zðŒõXêF~çÒb»•ÌŸ\îÄÍ)°sPâ^t5¬Uò”²Ç7Å|(×·Øå|µÊº¶4žâ£°ñô&òýÈ!ï@¾…ñ$6Ê©¥âi;r¼ #*š$^rŒ£DŸ‡]û¾ ÌÃõÈcÈÀæµlóëÂÆ,õ̶…7ÇÁÞòª<Ê~Žûê„õ›úLÂoŠó ää+ÈïrÑM°îŠ’#ÊžÆyò6ÎÀâò6òIä¡0ÎÅFõKÅ9g"»ì<NqNžÂâLLø–SÄYl¤+…sò³¾ó§Ø&GQbø4Xü~€ ¶b«ïa?^~NcøúP”&| ËóÄYli »Ca±¥1ü,~B[±¥°}y ""¯.®Ùim¾‚9ñ®¯imÚ -v-Ý -Þ³­saz ¹ùòn#ºc¬»¤d‹²§ñ‘»Wñ5÷1Ä–æ97)Jž#| Ëï ˆ³ØÒ<çEù-G˜~¿B[±¹ò[ŽöEfÁæ³YðöJ´Î•½’oÁo¯ä,ÛfùX×q!7G>ƒ|ù·ÝqÖ]PòŒ²§q”‡Í»YU>È~öÕqÁïÓìÓŒò[ëúùx@é]øyÄðž«ñögEw„u“Jö*{šß’§°ùrÓ„±û7„“oGl„}¹µË ì^ÊiqÝ{(né½»)㽓ç×¹ÃÁÆkx1,ºV>Öu]ˆá1cß ¨ò·Öµò±®[Íû¡øÝcìÚk§±ÿeÝ.Öõ«:¢_îý&{û.ïrþC,3Etò›/®>ÿ{¾‡UŸò¾¬ßæÂœ~ÈØߊ4ö|Z×ÏÇJgÜÓwÞyã}«î×ÅÙ1=ÛÒÿý¢uÕŽUZkwâÉò`óR3·]'ë¶)™Wö8b¶œåú{µÇ°}©GÙ²I®‹ËݜߥŽèãºß-§ïjÎ;Š·a”M(?à6¢Ë³®IÉaekÞóAÊy%¥Ž®[í1$ìï4ö*îBù>_—”Éöë:qÍ»åô]ÍyG÷^ú.ŸžOÿÄmDWǺf%§”=®yWÌ)×))utÝj!aO1 ÏøÏóuI™lçøX׉kÞ-§ïjÏ»«ìíå”®ŽuÍJ^Uö8çß)×))utÝj¡`ox|rÆÞÊdË°M׉sÞEí[?O S.õ,&ÏõˆÖpù?PKIÓ$@RPK×.f8-Pictures/200000B100002F1100001DFBDE17B70E.wmfí\hWU?wÛ7Sl† 2؆YÓ˜#nÒjŽ#‘–É¢¦¬_”‘3gJ²ˆ‰ü#ÿQÐ?3År5£6BÌ¢¿ÌÀ2(ÿÈ`³{Ž÷|ßûþx½ç÷ïÂáÜ{νïžw?÷¼sß½ïû5Ð.€ãÊw.¸q/@ýš'º w UÔ@~Ç6Hoa~}@7‡®£Ê³¹,mîÂü\¤;æsžLh@ºòõ÷#-d=¥?þþwšß§Ú-AZ„„fBNõ;55u³骑:‘&¹¼×ÛFdÄI&:âUJ/×›ðÎêÚÚ†`Ò6Ô”±¡TߢW÷~Óq¬¢Øe ¥Í~¦œ’U)¹Ð¥Oj ‹ÙPªoÑoDZoìýLàMê{þÈùCcôÃ+°^+`S–lZ›…LsY.˜Ñ?…4ŒôÒsH/"½ -n®‚ÒÑóƒž)…æA/R7ì€Ó˜ÔC¬Ezrú¹AÞÆ$su–â9ðÇw΀‡âû"«bÙ~ÅÏ(}’¾SȆR}‹^®7GÙ@÷–ùTr)ªO½Ô‚ôÒ¤ïS¢#ÿ(æSÏ"uÀë°[ùù ùQJûQÔyصë›Ð<\Štilld]PÕg©€ä}¶ -¬/ìA:Œ4ÄöK~?Ûy8P'ªÝÔgv“ŸEÚt -é=n#²£,»¦øn¥Ïü<ýÕÏ{Áâò.Òi¤!ßÏEGõ‹ù9]g"»ì<ÊpN?EÅ™ˆð%,G Œ³èHV ç -HÏ®Ÿa›^ŠãÃgÁâ÷„±]9Þ‰ü¸øœùð­Iq|˜ð%,/BgÑe>ìOŠŠ-á`ñûÂØŠŽ°(†í3H» yszÍNksyo­†d××´6m»–n·ÿ¡e>¬S#5#]AZÍmDvœeWoVúÌ?ÒOqbÜ'H«¾DzòýCtÙ:ÕÏ'ƾ„å(„q]ãüIQ±}‰vR¿ß Œ­è(^E‹qÛB1NÖ®Iƹ°1­\œÓ2âÜ  ýk€ËH[¹ÈN°ì²âÝJŸùHú)NœûìyÅ×>Ë]çüLqâáKX~aœE—Å9Rœw9”ðûÂ؊Ηw9:ÏÆÁ•h™/g%ß‚=9î¬ä<ëƹ¬ëø›O"Cº„tÛˆì$Ë.)~Né3¿N?ʼn͟ÝgEúòýZtYlö3ʼnͣ`±ƒ0΢Ëb³?)Nlþ,~¿@[Ñ•‹Íý*6SÒ±¹’Í“Šª -È|‰ÍôeÅ]c\l6ü½Ï$—ubó1¤ ¤«$çï•DvŒeWŸPú̯ÓOqb3áB3å Ò™|¿]›ýLqbóç`±ü -Â8‹.‹Íþ¤8>L˜~ƒƒØŠ®œ ô[„¸g}†sú)îw „%}ÇÄYt™û“⬯ SÂïwc+:_Ö׳Ý7ª3nï+(óa}MëgÚךcÜÞ—äeŽÊºNcDßy?lì9×^j–+Ù^ï,,ͱjâqX©ÆJòMlïÊ@¤æÓÇ<#Æe>ŒýlòƒÆÆÝ•ßÇv ÔñÁî³lÓ˜²[Ëz¸Ü«ä>¼g1|æjÜù¬ÈŽ°ì„âÝJŸÅ·ôSÔøF±é¨±ç7„SðlGt„}©µKl¿Ó’zößÒww#Æ}“”ùâÃ+Àúk8Y+—u]|ø±ßž2î[B‘bÙ)Å›•>óáôSœ÷ÌÃÆ~ktÚ„¿C]¹÷LòámàÖ¦D -`Ïj£Î×4~ºŠm¸ìïãûا¨Í./G>`è÷yóXF~ö2ë¶1ïWuW0o-ÃÛ¹]_§ƒ¯ÛÁý´+›ÚÙÖ6æ«™7òýà½MéßíÇ}Vê±ý¿ŒÉ#?§fºžßlìýSÿ4ÎÕ™Öù/h|ȯ¶óx×p¾Aa¡ë4$4VKvG« -È’êK¾›ß¤ú -Ê|Àãižï}*~kY+—uÝJ>Åî -Æ®½¶"‰íÞÀy’õ¨:"Ÿéó¦æö]Ìßåú˜WÉ;_R}þöz©>å{٠·9ý¨±ïŠ4ö½|ZÖÃå^%OÒïéwÞµÆýV=(K²/"ÚÛÒÿÿ¢e•öUZkwâÅjÁÆ¥&n#²N–mV¼Vé“ðÙR6”ê[ô•Ã6¶¥ùZä‹å¾8¿–ã»ÔyRÏ»™ô]Éy×bhï`ò¸ÈZX¶Nñ~¥OjÞ²Aò-ŠK]·ÒcHد1ö*Ȧa¾/É“î}.ë:IÍ»™ô]ÉyGÏ^ú]>íOÿÄmDVDz&ÅG”>©yWÈÉ×).utÝJ!a¿Ø¸=þ‹|_’'Ý.ë:IÍ»™ô]éywm¢s£œ’Õ±¬IñëJŸä¼ Ú ù:Å¥Ž®[é1ì -OÎ8ì)OºjÖé:Iλ¸}7€{T²Î•}* ¯çgô<–Ñÿ ÍgÝÝÌ©º{˜–áCÜn˜¯3Ì×æ~†”M•Þ£òylÒØ£¢÷”ùú-ƽe>¼7ʸ.3îÿ»$/cº,PGÏ•(ùbó¬–ëQZÀùÿPKü]œˆUPK×.f8 layout-cache5È1 -‚`Æá÷35jt ç …ÀKÍ^ »ˆÐœmëx6ø -ÿßöð89MI}*…'póxæRÒx\ØÑfðU`(CÃüÀêØЂ àÞ`8 -8ƒ”à -îàá±PKƒ<¥ŒgPK×.f8 content.xmlí½ÛŽãÈ’ øÞ_AD£U˜ …HQ·œÌœKæ©@çm3³NNc±HPb'EjH*"£Ô,³À¾6°À=X`¾àô{vnó‹¬_¨/Y3w’¢®t'é”SâAwU…x37·»™›=ûßfŽroùí¹ÏÏÔVûL±\ÓÛîÝó³Ÿ?½:œý‹õWϼÉÄ6­§cÏ\Ì,7<7=7„+ð¸<¥WŸŸ-|÷©gvðÔ5fVð44ŸzsËŸzš¾û)ùý%æÇÉÍé§Cë[Èú0Þ»ò¬1bÿ2¹9ýôØ7XÆ{«éÇ'ëÃßç|âÖgs#´× øæØî×çgÓ0œ?½¸xxxh=tZžw¡‡Ã r5ØLî›/|‡Ü56/,ÇÂjK½ˆïY¡Á -Þ›É]ÌF–ÏŒ#46v5¸¿c¦ˆû»¨1§†ÏLäæÕííŒÙ··3N?;3ÂéŽ=\¼‹äo^/iÁŸ±~ ï]A•éÛsæeÒ»ÓÏ{ž—€ŠP%àjí¶~AÿNÝý°÷öß-?u»¹÷vÓpÌãÞlÒà>õî8·î‘LÂGD;Ð.èåäæ`¼óÕÿòÍëæԚ˛íì›Ïm7 -1‰´Aú⯔XlR”©Ÿ& @Ï'†i-Ó àŠòŒò@rE¡ã^>?û ²¥2¬È=¾if;«×–¯˜Û¡ $xoø6Ê­•kHê$óíO·ñy$÷yzG•JéÉìóôdöyz2û<=™}žžÌ>OOfŸ§'³[Ñ“Ù­èÉèVô·Br·¢×¸9 û­X‰ÝŠ^S¡%¹[Ñ?*·¢/³[Ñ—Ù­èËìVôev+ú2»}™ÝŠ¾ÌnE_f·¢/£[ÑoÜ -ÉÝŠ~ãVä$ì´b%v+úM¶Br·bpTZ™ÝŠÌnÅ@f·b ³[1Ù­ÈìV d®ÐÈìó döy2ú<ƒÆç‘Üç4>O>´í°°‹õ0í ÈŒ'èHì§ -?Mr?mX‚Ÿ¦¶w¤ºzµnÚP›ÖiéZ¿¨ù2ä¦i-}X¸'ñPPÛ_­5(Þ0y(ȇ´:jaOh(£U:l¬RÉ­R écØ¡êÑÖXxrÙ­›ÜZYx­í6^51œ ¸†*Cs®z—½þnﲘÕvacYo -†=9Œeµ-³µ ÐIl.t¢ìå~ñÉAmAör¯¥©e NBƒ™áì±#¶˜‘¬a‹€·Æf–Ê"CJ>Á©“ѬŸÙi©}}›©§¶ÚaŶž¨!‘Ö°øÌ1UÔ”ÈaK딌ˑŒbf,Bï|å¢gTÕ6Å_¬2ʇŸwÒ÷ë…i -å£áÊÏ®mzck Å -DÛëu~2¦À#Ú> -¡Ujëlœ$mhì&Må˜ÛÐ)WËfm.Õ’Öš.GÜœi8ˆOQè’±P®Ä\~U™â2h’b^y¤%aBSI _í· ²UK1ª|¾È•'Ì -­“êàÁb®ÌÙI`±QÀ&,’+CØØ°‚Y(pVYèãí©°P¶ª–ƒªM\6ÒpHÝ8$Wn´á‚.Ø6©·›ÅMx"3•]þº_¾š_¾ðƒçϧ†JÒT™H3‡ð.Xº§VJ«Õò‚¬ Õ†˜yA¤ÉÂË ÕR{ù6I±äiðCõv}­5Fù<$>}ʬÉdœ’c(›´Ë‘ØÌò亨ÁNºØ±k’j4­ÕÕE1Ó6Na&×MjâÞЊGuÅÆA#aw®¤šÂ¹ÂzÅÝüºÏy‚³+øpP³QÕ(žÁ1NçážD^,ØXZ2»-Mè@g¦[qš¯Q- -›žM%«wéež¯Ñc -ƒ”Å '9­a †Êb ÊΔ6f^SÎÕ0áv&¬<‘Û0a£ Í„õ ‰ˆ?³Ü°©dÑö‚55 «——ï>𤓣ޥbÙÙöy9Ük2«G*ë)B ¼â£” -Ò˜ís㔊bŒVº[Ñ«<ÓzeÜr§lœŠ]ä}”9LÉÎñÔä„YÅ”'ëð¯†òNAî‰Ï¬5Ô'ƒÜ“ŽðÄg“òžLÃíZòˆ<‡6Ü­ÌóçSØ”çgùóÁZHþš>Χ–k (:wŒñüS‚2DÔ¹cÏìP^—"¾•¢èô’|kf€;fNd]›ëž/‚éÚ-ÜRñ¹6‘-|ŠÒK·U&AVã]*ú—µá)ïBúâ³õWõuáîÍÁ>,Y?çRì¹zÇíK1‰`Á!?9)sGŽEÁR¼ÕuPO_p`îðô!,É\3É%8–Ú@´Õƒ¹aZ«iº2¥š¬q•:ÕÕôeû"Übå˜ùsÌÁ©¾¬CÇÎE’¸KeŸ|>“ÔžÿžÐa´ÝÝ&ÿÛ@yÄçÊõß}ÒyNA' ) Ê‹Çʦ.uíô‚OxòJuù’©*¼E†äYöÀ“ÝóLª<94hf&ä¥x©Ê -šS¶‡9àW6…ˆr¹ÇØÉ®|ªmŠå¢ÚÓr˜McÓxÝ[¯™_ Rº”<ÊØ|-¥¤4ÖosÊl…Cšæù˜°]7<¸n¨vŽÔ XBépBiNÅÒ -Õ³‘(’•Ú¨]¯£A3¢öê‚Ųœ\áx¹aØtƒ97ðl’ÈTa_VC ÓRûµóOÌD6³j¯LeÙÕ. 1lÒqrQíéˆãº -_St`zMêˆêb.»X‰S¢kåµ1§€ * +ž6 STÉ š^ã5.EKWÖ4f-™mÔpÕO×ÈzҬᡆ‡äÐB"3§y9ˆë…d W‡¾Ú"šȉ -!çKǨ튓f29{ǒᚠо™£¼ÆM.ê,{g³ì1ÉËj»²D‚¥\‹~yaèÍPjª¶”Q²õI*J4õj£¶Åç¹êE½‘Ž–&Äê⡉B¦Ñ¤vDVR#ú¶‘¹øtÏ–t(?˜å:_¶& j»òÃ+Ç1"©”Ye\u”ݽj9òm‡ˆ8êÓÊj[Öþ^‡§?4ª²ö?<ya:žQŒ¹Ë>£Q1ï«"ëÿ‡²õ餳šà2 A6\ F¡ îßÐÖÒnK§ß“z_* ÄÅ9ʾ®ƒg©¶ÔžD›:¤×!©êQ6™’ÌÝhX¤Ö,R׊q1g–ĶoË(uÈ"Ez}½À™Ë›æF*Ê%k×ÆFU2!Ñô¯¬WþRY ¬ËK¥re´¦@¹Œ=´ -o*&¶Ñ¶àá°G¨÷DQW/7=w÷ZU_YÝÐsc×ñRå‘ö0’Ünkú÷H+BšxJ£ÌÚQ&bj-9Í)ëÀŽýGZà¯éã|j¹’Ö¹cŒÇ ”NçŽ=³Lt†×þ®p¿¤²ÍËçDyâ;Í~W±ßU„•g­ºdIù"}ü«ºú¤ŠK¸û*~*°˜ÀÍb7¹ -¦Ž|+l›VÑqtù¸,W]JQÌ!ò*’«H„Í~¯/RøCUòènä pc/¯Ÿ`aËúü.ñ{˜ÓÂò”õ:rÑ©Âo.tÆ許_…+¢F±M)ÛR®xÓªp,ÙX¦Ù4ÖMÓ«ðI¥Ñ2 ÎJÅè¯Â»”FÍȇþRÎ04µ_ŒØ–'ßÄ¿˜7í0§ŠoÚ‘´cäÞ/~·¼,‘v’ûS¾ã¯Ë“¢/{ë$gùr姧Ÿð“¨`B¥m’+×Å7WØí” »ò$€+p?¤Ë v·;ÛÑo[úEÞº@v®bcQÇv¿fYQÍ60mƒ§[XIR~ã§)椋R¬al_C‰“¤™¬æõ#›ÃLE*L`Ðõ£–ÃœL¨À¶•Èñ.×øC"rT’dsU\ƒ_±Ê‰ì -•Wºùã -e£;^%Àˆ¡˜ýW÷¨¶\}Èzò7ª?brZ‡Œzu­‰¯2P.]Ü¥'ÏX‡½»Ö Ý+ƒE¥ë -yÔ1Í^®£%¢ûÝHîMhJäÞŸ* -ø"u‡;„,m´¿õSE)_·˜f«mµ<ó.)̲_bÂ,ÛŽò•f;kG€>Ì$ÅÒ4}í˱8¡¦Ô¥ëœ~Ê8}Ô?t¤â`½áäSG‡‹b4q\ö]’§¹b#ü¸+Z¸w[žqUnkí·­”š‹†)%Ý]yº,ŠÜÖõ@Vµ‘*îM©¢ÿ[̱ٔd® êhb8]´gHµÞÜ0íðqËc3P*ÏÏ‚Ðpdž?¦T“Ij7Èk.( -]ì""^rÞðS¥!ç™=;ÖvŠ¦ÝCj>MjÆÝêØAD–+ýZÈry“cÝ[NLÁ‹ÙÈòz‡ÄÛ×ÀØôg`òì‚ó-Z)oé”ò½”·tKyK¯”·ôKyË ”· Ky‹ÚÞúšnI½'%VÉ[f(U\ÛÈjD ´:ÄMÌTû`¡ŒµÆHðã³ o2±M멱f€È¥—ŸE—FÞø‘<ýo¡ŸŒ~ÀÕ ø÷g©×L\¾Q®QµzŽÌûÙ§Êåؘ‡ö½¥\îWåá‚›}¤€²ƒ›A¿ßÛsbnG(Ÿg÷ö=<ì[Ê -aåXßÊø‚NæÒxï˜n¹Cˆkæg/.áÔóŸô®(§ÖשW#è§¹ß ‚¡ÝþAî¹& 'hyþÝ–wn[M7s½¼wlƒ¼·òÖ}Këo ¸(m7ßõùóàíb¦¥ùžÈe;´fôÇ= öÏ^Ћ¡gžƒuý5¾ÇGkôÞ æžºZäñBß"‡Œ&JÓ‚]Ñ/É:R?î߀Ÿ<ßþØÏppÀkÛµ2·lyÇpCOïÞ zkÛ]ÄzsƒÊÞªåë3^²ë5{esÄÕGR×J,=vïÄŽ½ØÜ‚{ö^ÍVªS+øbîæ -ŸÀ€ÿ)ÖVpÇþ›áe«H N-0>±ï>*feáÚèÉN$ÕÍ¥T@©nÄR}„R=ºJDzrÅŒdû<’í­Ùä´š-†×n©5êúÊ2ÂHòCg¶ÐW{g/>ùÌ ÛU&¸Š7Q–+A]¤¾õTaÝöóžvs*4@bšPO“òÓ„|cóÙdlfÅx…²˜{nll^¼˜ûÖ½í-Å0­ €ÿSBð¼–AÀ~Ï–KXáÍè6âdÀÿ;Ž‡¦®2³fžÿ€#äË› ” 8PƱŒ{°íÓ'ËÜúbN‘¦– ªÎWæ^Ø KZ¢0²4Aõ‚_PaF$À {@7vnøð,&P|kba4 .á1ô³”Ðßð R· -z@ ^ŠYør„g°ÈÎŒ½°× !凫O—?Šål“%Ò0l¼øÿc#4`¿=Ü`¸, -‚?¾MFƒèa@üîXîÐÜÄ÷fŠŠ{©öDAñjá8K0~°ÇðáEŽ -Ùd*ÃAˆ­¬#ÂG¦ónmÏžP¾ƒ}ï™Â½³DANf>MPꬪï{Û¨€”?Xwp?ðÓhx¾ . ÿ3;èN XßLk&4:$h`)^Ÿø=¯Á$tSà„»}BBÓ9ÙËžÆl%êóŸ¼UbXù8­¿vǻɊkO³6‰è£¸¹½QBãN¯ëê`?Ï*é`Œ­so2 ”‘>X–»dö À -Ñò€$oá›ëWQ;êx¼(mÓ‹šØ€é©mù†oNW¼Ûz[U[úZÈOCª{ÈÓ[¾ÿÇïúþOßÿó÷¿üöï¿ÿ }xr1ý–õ[âýX¾ój‹™›ýlër·ÌóøU±Ç¯·>ŽZ+ûÙxÝkŸ¶@“2,;A,¥Ëäà}CqÀQdœ„SÎÃÇ9É! ¯ïÖ'×vMg1¶.ÖÈþ\xu!¦wã|yý¢àJ -$önw¾ú;ìÞáö´ÐJõÌ•.ð0§A0öÍ/¨ÏÓ—æ~º.åä‚|òs0sf ‡¤l"LØ0$ž#ð -iUEZck‚!²û©ÔdÕψCvì’°b웤ýoQyt逧>3Lß‹-­ìÈ¥~öBY¹ù´¨x =S1#½t¦É)’úþkB²¡.)6+E]£/ÁcðÅžHO`DýÂÏÔ^“†èƒ‰iÃû©rnMŠMB -‹q ;‰e©â.’ f]!É5XSm+ÖÅœ½ÀÄV½ýËN»ñ//wf¡>pLmÖÑFZë^jÁÓQQ°Pƒ)Jb¢£,k¼¡Û™±!3üÐiDF#2ʲ‰½yë^~yAL`€•VÁÕO*#u´„ŠŒñØÿ27Âé-í{¾³ùü—¹*99êv3qÝp=˜àÇ%1ÛЀT… ÇbhõN;¢%?g`Ý@ÎHž'œ!·eÇĤ‚‡'pñ -__¤ìŽÙâÛ1ú¤‚“”«eǵL³…ÚxB>"s>*!8ar—8"‘;VO}!ý,ÿè>®ã!wZ9¦ÜY®å!8ú[¨ý´èV~1m»vø«œ­c Zj¥*\¿m8ö/4¬ýê㛆jå§ZZ^ýeFΊ…¼å§ÜSQÍy„”†Œå7 dƒ½BøH˜Vøór´þ†Tk q#Rõá1Ðjt¥!Ö£$Ö±…-%OÜ.HŽ¥FØÊ•ß"ˆöê”=²]ôÛøfõ á‘~ÙSkË“¢â¨ò…ô]ä½1Ïþ­5­Ó»Ët° Ó -ˆ‰iÍKfÔ¦dF 6ö±µÍÓ1‚ Hž“%Õ3‘´Iõà¡kPÈbIøE¾cÊ -ÕUAuþxIu£ ¡<ù ÏaÓG3TLÃqαí*É]¼À‚ψOŒää6Õä’ö_fžk‡^­dÞ²ËÌ2‚…O{FFÔ×Pšû”¢´BŒ<Ã׉Ä,l%þgh™xØå4‰KbÍ9³ìÁT'’¢ Ÿ,1I,©Àô7f_R½ˆêa†‘øDºƒRCWòìÎ’®@L¹aý(ŠVÅÌR=¹ïÖ{h?qI¬c¡eãW\›–[Øb—‘ -b4d&Ö-ÉŒt(˜ûVˆÅµ ´ÕŒÒ -üä$j:`fwÜ9‹#¡½N_^Ú G_æ¾wW zKÑS’˜ÀnžwÀ>§EQ2[d@Qx*Vv‘Úa Õøp,½KTpúÉžÕ<ÿ׫0ÿ×é6’a{|™ÚŽÕ{òK†7ØTã£=S(ÐQ[Ó·ç&Ç6©D0Õ‹˜R-AK ¥•_é/;Q³§‰u*m’½ -}£·õ*~žêPc<“ž=HתĚðM8“âÞ¶Ös;ê7‘_p‹ÞëÙ‡ôÍ)=€‹ÞMÆÞ¤F«ÐCïà{"¯p䈗˜§àèz&,™“¡pPLâØ -ÏM>œ]š6X™®bÊdá8+cž°¿ -€¸úùÏǤcºm, ™çst° ÏŸÐáU¾E‚þ ¸s¬ŒdXAÒ°¶¥¼õ”ñ#ÑÌÃÛy„s·ìçŶg#JDIJÙö§µ‰(ùkÁçÝlG&“ÏqÐcŠÑMÇ3¿*É ¢–Ì©=û’¯™C¹X{K«vö‡Á•l±ß -ZC¹u#˘Öî­®2ÚzW «¦±ƒÝd{ÔY¥Czhši –ÞÈvlóž‹…ë9=T<Çê8>-=2lWãɹ5{(T6·öq©Ÿ°DwˆXöÑà«<Ü·ÚOˆãý”Æ!371ž`»ñ_òBTnqƒŸd¶äSÛœ¢Ô0NH”rqþ©LÀáϵÛêi]ö§Àûÿþ ×G‚•¤„dÞ &k@ -ÔQÒ€ó}N$ÉÔ¾›žÏ}Ûóíð1>^£Œ(tæ -ìœöê<æ-õ ÌT"Zné¸ÈmgîO@ž Ë‘'8‰ow«Öb %-DÈüÒsß<ñæŽSßÂtþ1*óÕÒ‹ø z.6iÜî63óaSÉ™¦ “¹|¦‰2`˜hkGP5818ò,ÁÕté–‘q·`?!û|+U¡Ë O’N¸ê+“©Ô%òV?ñÝÁÒªo|×ꊫõ†ô¼¸7fQ -s¦ó!hŒ‘°n.]ïõÂÁ¤>7èà0‘á«köø~•¹AD(,¬&›ƒÒÝq/‘^’…¾uÁbî¹ðA3Ú"ÓWuÊ%uz.O,dÆrA¿#}¨Ø Q[|g} 2Ò~!³%‹¤bNn;=ÝgM¸´°ˆ#’­»u’ÃóоO:F&aµ–’¤é5&> -çñ”%Tã;ƒT$%I™+¡ñÕŠäÌjWÊFÀˆ°ÿ¹ZJΖrzë -g9^Ò¡zŸ‹—~õñM@œË0§ipûKÐÂX÷ÔÙ4.ñõ°¹›bІÿ*VðõµïjÿêjÕüÞG2F1Ë)}zm)¥OºI{#ŠþŸ œÄ‡íôLß2HŠÍµPb¤‡Õ%æž!¢g[£ôFŽ”«Ç_GÓEvM Y?©Ò°ûQ4ø& %{›{žgö7d!ÚR˜D4¢îÂi›{mÎ]\k·„,²ÃzJË4E‹è’tøÈ¢…A€öT½¸¸ -!‘ã…E‹c¢r¢àÑ5§¾çz p-¬À -ñݘnO¢\´@’,:x²Äù q1 -B;\`áãƒN•x¤Î»Ûâ‹MÆŒ/yc„Æyj–V=DF—¡œ:ÓÎê–\ìíîÆðx—;¼¸åƒì¯™«\˳š´KBÄÞÒÉÀcû>ì>-9\ÆfFð•æÕÓóØ =µaøܾÇ%RÉåœs9|”*ÜçÔÑçˆ,/½²9øUp‚euRlV›{oùQÑ‘CËàåzà3(à «‹ŒÚz”²½ý†áÜa%Ôt,§¸SÌQ-°ÎhUùÙÁÂÞrÒاŠ~N^iSvDªNñ––ò£lQ~žÆ³mŒ¬Ý®ý ,ÛÀ˜úCéCrŒïañ¹çV3¶W¹- -èý=¨!»˜Ûs–ÕëOÈ -"¼‚YK+ŸÖÄŵQ>‘œM\-v®ë'5(Xï[w°kùÂü½l9Ø롘ÃL¥5×Ͼõ4zChŒ˜Ø=öØÄ çÑÑ^Ö)™0ßõåGåµbùóׯ乿ÿú"ž°iUèØrŒG<7U`›&¨‹'@4áƒeQŠøðòò&ñ€I %ühܶC««c¶™Ø>ÒyÑÒF»p7Q–ƒ¢»ßnøá9a…çg©3í…¶ôjym¹w¶R²ŸÑÍ€{g‹Yd_Ï0G„0µºI)OõÓˆîlñÕc+™¦R6QXÒé\Á=pÁøÇ´§ÁEÚ$À`pœ|ÀÓú—ןnÿø’ë;1O†[èÄS¸Ôòáû/¯ºüðvŒ«iŒ“ÿ_¢èU ::Á£>ÒŸKìæ²(×´Qn^:NdƬapdMˆY·=¬ 2ãÒv¤•jѱ* *\GVXK¹\‡#Ø-XÔOFß»ÈÁö°„ËŸ?½÷êÃË?åZE.s§„=FàQ1 ôÌðŸ?Ü~Ê·½ô Z¼¹É.]õC¬¾~TFDEA¹!.’øñ6),ñ#ádDâþ3ƒ­c×"š17âÆk„@xÖ›[có‚EýÇ%ûÑÞ¢…$ù—Èá´ÙQ÷pQ -Ñ<žÏ÷>¢YQniš¡;½ªç)ÚÄ‹ XQÚ9”ÞÂ…¼Ac -Ü1ÔŸÉùª 1§QºáAlk•K{f‡<¤Š$DäÝÊ™H1 ÿœ†?ÎHàµ~ÂÞŠÖÒ”ó%²“žíõcjq¹ û³ZìŒÆçC'\T«Ÿ½HŸ²?…rµÓyóÓ/|&”¨UL‚«¸gL±\ö]ŠÛï‘[VÛGig™¦´ÄaJ÷}¢Œ—ùlë2nÍ•ïñ«b_{ü¦Øã/·>ÎÒPM+ÒPMßr±àÑãùk¿g6]Ô -·>ëgÅØ°7Zø„«û< |¹ìdòldV‹+Øòðâ“é|]Ï+— -æËÀüd~eñYI -‹òkQvùÉ7Ç"7檑q®ÐÚu$žʘ‰4)”ü‹‚¶:B­¥ eÎh sŠ¬i¬'ÈäbM5È3·Ç6‘Ñ“øPìíT¦ñJ`(]“Ân«';˳xL,ÿÀ:¼äh8þ3ÉDù1ñ•>0’ó‘*=§«òs:+…Ó3Ùh€ÚÎÎGÃ|ßå"Ø+›Cˆèj*™´<Òhù¶W+›¡q7!Ÿ›à×ǃ'¹˜K´ïÓ?\­ÙøÒr@£ímŸG'¾)5“vøò©òˆêã^[v… …9À휾òkV³„ª˜ôD ®ò§ì¶*eyI]®Z|>õΘô?YÊÔ‚ÿ&½à¢òo8ìégZvB‹¢¿‘QRuŠù«eÍ—uä v4…=&²Àº@®"™TT“±&(©Òn)¯xòòú²$€ÙðL\?@&lÐZŒ@QµöÿsÐRÖç³.îÇÌsíT“`yY -^Ãv>A+¶uãD; Ý`mŸNGÆôx6vá„X -èx9 °¿úy7dõeª¼Æã@ãÝ]ð -VlcAVÖåå.šâ;µP`±Œ§è¢êè@ç½õÜó¤ïQê@4òEt Kƒ¨^2i¹’ª¨n­¡Ô -ñ¨ýOZ¬¡ˆÜH*k—¥Lø?„rÏûª8öW‹yPjõK»§à£“]ðÑ)PðÑ)VðÑi]í¨\ð­¹……·XºPè…j::;j:˜Uìñ?ôë·ýúß殦éñ:¥TN¨â,¼rè— k@è` - ©•`Wv<Ê°/;€ÉrÊ *0X:¬ YuIYa·¢êSË*F¤Ä&³õ8nàÚ«Û̽êÞ+ÖQÍù—^Â/ŽÌKPÀ­RöV\…CóÙp•¬)ª)›€|Œáyö*ª -ò%¬vx$0 _„b͹2 kÎÉ/DQZJR¸jÔ<´-UFJA`À¬ ÅFOÆ謈ì`Ö•Bc¸'…FÙal”çIv-ïÔ„Ðæ¡zvKÄg’z îzg&‡ò|O«#|û¨6‚@x&¥…Ÿi*7FÒ#³.4KZ&M -̉Ÿ &ƒØt#eÌcŠmGÊÓT1î Û=dÃÆ=}—W3®cOq½P™÷IPìÌ·,ÿcìÚ3LÁ†–#-“ôÅ ±{jà؃=@x\Ë/± Û5Å´¾³¹5Ç\Kœ2£øEòbÖg˜ûÀ.{¿"®'@ ˜‚šYöeO÷9›SIf$Ùe¸ðùÉ"•^Á¥Ø.èšÉ†=~ú +É®Ç/:15K”Ñ.j¹ëƒ¸rƒ}/†Øã|ÝòÙ4·ì¦¡)(ú‘e¹Êغ·oÔD þøÁ'D•˜?ýñæ5k1â@φ­»ì 3@8A;-øÐr)P‹À¸#ÅïFo™áù;߆;ä÷¾wç³uˆà5èÑÅÆ·Ž}°:\ü•±7SŒùÜ÷ sª<ÈKX¨êCüà £[ÉV0®^ïì7hë.\W¶-ŒkƒÉÚA¯–š‹ãE»_µ/Ý,©««Ë~rQ™ì‚|j™]êñ[À½hæ~TÌõ9¾O…Çýðvt¥hà€ý1}¨5òßÉ[X :fég æ~ä9'œ­Ì-œçYmÉ·2Š¤ƒäõ-c¼ -ŠF&,û緔˙·pI('}çŠëÅx> ZJ}kíÞÔü›™QAæ3¤~%›ÄæH•9ãÎ#¸¶}çZã$L‘©ÇÙRÙëõF¶Ô^¶D[yÙ‚'Xž¡(øÙ¨<=2×É#ä Î^¼¡!~ÜÓ°j°ð‰Ù¾žU‘”U†™¬2lgÅVx)BæK -”¸"Ë„'Hmr káÒ¤ áwâXÄ­‹¦D:ƨˆû°Ë{K]4üÖ¥ôhþ†&“'Pÿ†®H³ŒÐΑd»–Ÿ}¦[‡y;y‰Lž(¬™(D&g:uݸŽ'd˜S{Îü~‰¯Xd3¥§ÝÞ«ívvR'ûž¤'Ø2k{½¥¶ÔæÕÞ7ô¹SÂÝ—3ÜÔ0e `>óÔ¨m5AÞ²¶iÏqöaöqöaãìÃbÇÙ‡­«b_{|ûYw–ªða‘#ÓÃÂ'ñ:zV±ÃÙ‹·ð_섺?šò¬¼âÀâ‹WÛÚÙ‹­I´h¤õ3Ú‹"¡¼)Ê·^h±âòYIg+ŠrQÁ*S²nÓù*”‚ -ÂÈÂé¶;_„r²ºèÕÃbTŽò£³#[NLݦåìc­ÇĶ¾X¡Ì¤K Ls¦”PŠg°†gdà5˜{u|´HÊ -+ÖŒ9Òóg/¾ðP Èh8·\(;g/æ¯Wv¸^ã×°ÙIøè‹é9O1Ÿ_.å§qÀg\>þúã¶,µI¤È”±5±]k¬Œ—Eçñ™ccŽQÃå@IÎ1ÈΧ&úišô´S -×ë@á/è–;–{N—A<®ÓÃ?«º?à°5Ìâ†Ý“«–Ë^>=d˵^8X0™—û -W…ßp½ë -l¨¾LÉ¡ÜÂ&H}îÖzËí|s`·I"‰ÁU•eˆƒ -Ü<}´†àõÙ»†ÔjMj{¹”›wº´¶rÑh«tpeIfŸçZçS¬5öÆÖ8i›âãvàØÜTò»?Þ"ö”Îml)•Ä’YX²F0÷Ü@x…رñ”9µÇ_léiµ!OžÞŽå'Ç%Vg,Ï“ãÊí -@rwÊ<áÉMmuÑ3µâŠ£YlÁºcã‹L1ÉMnõQ7€Kù™âôÒë„ÈgrÓO½¨|&?™kq/n’DŸÁú‰ã“!¿2ž*j¹Ál„¼¼T¾¬šX3u ô:Ä’”¿ÿúq•zì“nÿû¯ÿAÁ¦=†s¢ÒÿÞ7àDùÂGm„| ÛYÙã%73†6s6ûÀéf^RÓ§ä5Ž³ëCîÃñø­¤amƒjmPôè{ïè»ÚÎ>û÷l‘@Œµ*j»Øéwx¾Ðñwx¾Ðùwx>ÿxx¸€FÔîøV_Ùø²`|i¹®§à‹³R:mü¯ÄQŒ˜Rà¬ÆE‚¯‘#+ Tž‘³U%<À¬|á…3Mb.ñʺa´<ǯ¤¦àºpU'—€ÎFHGå"ϳhŽ¸E•Ja›êÎåÉÁ6æWë‹+5EÖ…sª™6$ž‡Äƒ†Â -?f -÷†Ä?j7oHü¸Iü¡±Ä -g¢p¾¢„ì ™³{í³—8ÝœOÙÝ•Œ“ÃAûCø1×SLÇ3¿®V4±ÍwÆÂ(Zï:$UÛ‡.dÁÒâXo'ïXÁM‡ -l_™OqáÀ2§†Ì ö=¸Á!Zdm\ -¡$àºèÀ¡=²;|$C³¦¡7?wp3Žñ^8Vü’¹ïáÄã<¢Õö€abEÖÔ$f؃].Y¸â¡T•Tž¹æÔ÷\oAGCÁŽó}vD»·kLGFG³)¸  ÌÒR.ArÅ{MfÄ$/Ÿ{ŽáÃ^n_p(9Âz]îOTÖHÆZ+tž:@©ñ•T虞³†Hñƒïˆ»Ñ6‚ÀòC2 'lFå’1Fع^M5Œ¹ˆOo_ÄÍžpÔmÁ¢?D`øÖÌ°Ý '`8uáD¨ãCÁkelìГç<Â+b؈eËËi\ U?ÛÁt„¨Æ¸|su©\þË[lâgâ¨l°œá#l¥&:ÆVè){«eé´¶Ô’êQ|ÔvÇ8£ …¥©#—@8ê–’t³ªœ‡>¢j>¢ž-„‘¥¬öz¸Éïù-媵;HxD£ƒ¬Œ-z§íF3èpب£× ÉìS2¦n1ScH…J¥…‘5ž¡ŒQ/Òô\@…ë@Žw´á(¿X¾Ç<+ 5’ËÓ<+à΃ñ¬@ÕbbmöW.KUÿÏ™© ¢bm,eŒïmD$aJi„}à&×|$|x -ɹ‘ÎTLøÚƒ=¶€î -MMeÚ7 7Þ»[s P¦bDƒsÍ”ubÝÛ¨ª³9˜7©•‚Ù³Ÿ‰dŠQÅŒ2O, Ë cƒŸ #QóÙ|4 G.Fºﱃ`oàç·Ÿ^&*y±ùšþ)ÁuÌÚj'¶ ÛÏ–½ -É®"Q¸Ñáöñ«ûÔ-‡eÅw² -ŽSUÀu'ÂPh›_D®a” Ì|˜¶âÂ?ć±fóðQIu³J§ÜJ}“k„x6ÚïÅZ„{ê)¡¯IŒø¯‚£ðTêÒõmK†½Ú³f²¢ðÁSð0ù½µÁ6c{2ÿÜðMÉ,ѾG±A¬á•ð0UÍjÃ.é-' Ó«æó3ôœwg•·"5õc ¬ú!-ÔªàÔ//oÕ¸7Àx[õë(gFýèˆ×}¼Y\þícÚT•?/whü‡îÊ?S®_ÿÀN^°Û×F ¼¦›ÉjøñÀ2Dé«záŒï7üðœPÖó³TtµØöê°¹ìñá„f¦Ú,NÙ£€™â…X½Ï.Ï^p„»KÀ1`´öy¹qTxÛV <`„Lzs¿·p1C¹«v:o~ú%"€‰OmI—º§Ÿ½ˆh.²ÈÅÁ£ d€,˜¦ïñ¸pÝøØ—›ÿéËûÛ÷/_ß¾}É 3§OGqds-&q¾a~µBÐV6µáw¾1Ÿ*zK# [!h¡Ì(@GH«j/‹¢!ÓìøíóL³Å×¾9xÍp!ô3€¾ ô -ÛÄøÌj.f‡å»!©ŠË3†ü‡:ر™G8¡B ¨€‰³ôaÔ0w"¹Aƒ¸0˼"ëÜþt '°¾[ôÜ6UVÄ©7(&q -ÎùâT@¡x¥‡!ac<&3C@ -úÖ,S&EÑ|ïxk¢ BŽDÏp/¹ö(ÚE÷2¯UűÁ^¾úðå§Û/7·/¯^snòï¿þƒ²²sc;Àô¤2µï¦ÊÜ·=L?ÄQ 8ZÁ41„a¾×­ â_¿ûœóçÛñâ'íUØ“µ }. ìúÝ›«Û·—ŸÞ}ø;öçà[_~þøòËç›ËO—Y+X€ÞyÄðæ¶ÔÜ£¦œ>ák¾c[~Kùh± Ï~›Ç¤ IÏØfäû†Îî¬X£ìöwúer†¦Ö€1Þ¾ûôåãO—^~¹¼þô(ÿÍåÛ›‚äëƒ0·^xûÇËTøyâ{3¸û™_¯^.ÇÆœxÙñ[æöÜrÐj‹¢c\ÀÂ×ùC¡9‰Œ³ÔB*Ò÷öå—›—×ïn^~`ç •K"æ9ŒÄÞº‘8·ü™Ææ¢ç‚lļt`‘äÄ´žE]ÞˆFH‡—.¤¡JD©nÊ=V‡½b*íkkTú6™ö¸—ÆE¥ý -*õ½©s»'qeò+5d¼Œµýd¼ý¡Ìð3Üðq-ÜÕMä¿“½å² ÷)Û'JaiLÔ0n;ñ–Â^†×ÂùJ9‚8Cöp‰ôÁE -x/*iCËþ|n`aáf´¯ê`Ú¥–¸»KÉwo-$oöl1C… -ÌÅŒÔ5É¢Ø4)Itø½å;Æ|Ž´Xö$eBð:LƒÁµ–òêöÕ;%˜z gŒá:RIJv†ekð¾¹÷7Ì^¨£i%”r€¨¸ -1ºî[½åŽ)X¸4®J[äÃW$}ûÙóÇÊ{#àÌ|šúÞâŽÝÍB–eÏ«ð>¿ÿÄóú9WÌ—àY¦Ahh²^ŸD©y‰™b6ÝN,¹ŠÇGDär-*q½ž{éQmà¯PcÂõ[RA$¸'-r’º@JÇ·/‚O]p®oDi"W‰ÛUù“˜)Û‚ý=_Ø -¿•#ì†+‹?SùÒÜ„›ÃÍJ/“ÊU%1ÁÕªwŽVÝíí¥…‰ëD˼‚Œ¢ŠTÍ=åpeÔQ$,¬_Ô…‹©˜#Û5Bp²à/R«Œ’î Èò(Td:Q*YšTK'µ.v@«%÷©ÜGbs¢NÛqcË z7>—q(9ŸfŽ¥ÒOЈZ)Œu8‹¹Wˆ.·–ep<¹|wÌõ=…›ú9¡›/sщ}Θž"UB*ãìxžbC'¤œ[T -PölìO'>ü¤ÿLß2ñÕ3ú+ýûû?üöë÷?ýöï¾ÿå·ÿíûŸû·ßÿÓ÷¿|ÿ•ïÿíû?ýö¿ÿó÷ÿôÛÿªF¾'ðÌÔó£3£FpnN -ÿL îïž>`wÖçgªÖj÷ÌýmjÙwÓðùY¿Õ ñGòÑ_Îm ßoÏÏÚ1œö ÃßÛýútê[X…Mè=¸ÐÚø¿Kÿ©½RUü·zóêJ½lëZ÷ò²õ0›œEF'Y‰•ÿNÖÃó3 |Üqü“¯6B¸Ós_{Æ8é_|±ÄY‰›šÉõÔYºCîÖ[–J2ìÉ -4†·Ë -¢¶Fü\ºŒ@9 '“³\KÕ3™ä3nεhÃðš&‚ÕTvV{¹Îj7ºÖÖ_ÞÜ–ÕÔN»T^ã¢?dL0&—%V—ÎÀ«öÛªÆ;c¯€4™3ª¼G€x舳x¸R7ÄÃKµÕo¿<¬x臕£• b¥nNéÀÑ訇as]›wØÙüjÍ/_]u¯z½Á‰[úùüÈmy7—)ßaÐÃöƒ~Ò'Y3[÷±7Àx ¼°ïËFyÖHG ïOR$Õµ»ê¢º†f¬ø÷ ½õÈƃçûð<®¤#å…j|’C§ñƒØ²D™ØßÒ‡<˜q$°Ñ³#gä[ÆWøqaâ¹ÝÀñð‘§h;i1Õ÷&Bú*¾± -á~‡ädÆÄfAL²SˆNì-À€fOâáŠSi¤å™g.ãÈ_¡øû„]b`©ÓGÂÌ<Í×àty -ׇSµ8Ë“ziÆ ûVw†›q§?v º4‘zg…I©Ôà J:ÙÆ~ bÐÛw®m´+ãø`9í'šâÝ<¿ÉY•D[ðÍ¥ƒÙ7'cÆ›ÃîQ ò!R_†S–=;÷MÊT&eª‰ñœîÊ8iR-8)SÝ1)“©Ó®Z¨Ó®ZÎüú[³‚Ÿ•Ø#0UÁ`MºoÌ„¼1Z3ãõ§ÄõþAŸ‡qƒŒÛ]ö‹|ÉçgZwoÿ D𬬆Ӆ٠ŒQVªXÒ/£‹³ë-;æžäi’ïQ‡ 2þçöÿ¢5;´;LÏu`ôp%!ŠÆßLÃÅe†£-È°Y²6WØ'8%ÑWr„Œ (l¾,?>s6ó\;ôhÿMl.ŒÕÄIÕ´¨0ó1eá˜ú¨½_†¾Ø6Ü}Îf–,|r, »ï/œ0ØñQªË—éÙ‰YÌ -¼IX!ìÔ] ‚éåm%¦wV1HÚ*ã…oС1Z»½Xš\1ìÍJw,+¾³=]ëJK%Òr ^1ìa÷oèü zi¬â‘‘ j·ÕÓºÿýÏ2z61€ÆÔM­ñNÁìˆ.|×ðQ -GôaôlÙ-8ô -7ÀÖ¯Þf®M%î01G´`/ -ç'i’dÆQ´»G´ÖëeËíµ¶°d{iÃØcYo7K5ço«ŒØêìV®qVÆ<<œ÷f‹E`ð»¡íë[`ð -:6´‰Ïï,Òú9ÎóEê$I÷åJ—ë%Ô(à®ÇY»nKEœŽ"§ilÏÑô;Áj@š'¥’|­P’º:ö†÷#Oá U%xä<}01m”D*[OcÈàiE2xZÁ ž¶#ƒÇþüuþ  V(Ô¢Ïêý”o¹…baÊ€>5k³‚•>À®È·†ëÖPÙh×ÂäV4j¦Ï^´ÅÒTa¦boäé:ýï{°ÛÞÝ+ðI‘÷¼-þ¢}+ñE ûpqˆÛ^¬­:ü.“ŠL‡—bWÍ0܆l´ÏTô±/î%Ótµõ&¬ü¸ÈWd¥@Å䛿ÓaÝI÷$)·sl”›«YæI“.G†#,é8“GVÂx.N`Žƒ†Ø$‰L)}’þ…4²Â€Æú]t–i2™N¢ ÌM&™ÂS]šl\ ÃöJÄMõ&I¨5äð`Dt#\iµem§¥µ¶wÅÏ ƒtË™qºÑB·¥x¸Bj†k8è÷bm3F—yVª.SŽí~Õþ]±s•1X •Å±ÛÝàeæ7zÐîˆÚ®]H^Qò´Ëp¡ÛË¡âuÂL$ýh‘ûäütDª\tŸ®z„‰ ë¾1Ýc¦ku°.¦oÔîÕðzxè&a½ìö LtÐÓ -wä‘éžR:ç9n¨‘~„ƒÐÍŽ¦[ž†Wµ”+"ðã½h¦¦'‰žÄÒÀ'3¡áÞžáûvŒ¡ÁŽp°PWï3²PŸ™…º}ÂBúË«„….µá«¡Þ=´jèó·Iâ×:;ÝÕÒYi¸•È¼ø‹ ¸ÞÅHîÀ=U³ C›l2Â&f6éiëlz}óêêÀýæø)¾[[Šg¢tÛ5)Œð'k½˜N¦^oì[–Ðäã¤z–¡‹ªôxƒ*$¬ˆ1•rFWt†˜ Yª¶…˜íÃÚGW„šíO(F´äÍŠ®p9ù\V„ÍÞž'΢27ˆ×:ƒõ@‹Úîô®ÛÝ# ´h<ÒµLt EÉLHø0dËÞjG«ÌÍÖ·ÄQ^vÚW½WjûÐ9;ÿP@ sÄQ†núÍA±/44"^®³œÀÂDì -ÉyxÕ'ÿæJ+O%mÕI ›³cmn/ªSN…‘=¡¦H2š+qÐØ×ÊTž:$vÆa®CÒUmq.{/{ÃÞðÀY4á±OxL,cð…é^‘ù¸9ê˜ò3CSo(€1¸ -™˜ƒ¹IW/×c¨¶¾Þ«Azy»Zh‚k{×Ë3ªf®ã©{bç8æº']®sœÚ{¥]]^ºt°ŠhÎkâuMA@árÿá¢þ’ƺMq×Ëö½n/¦û º.Mãe%DѦ -ÚCB[‰HN’ëg”U‘¹ùŽúñvŽUI{s³¹ÏÔhç*4¶OÕÙˆr+}†hN±Ä¨ÛZóHÚ 1´g¤!"B93€Ž{f‡É™Ï%ÌD­À¥:‘ãÕ¸j¿)ß“LBÛ!] -²ý˜e#-NEZd¢–|©8^HÚìÅàò1i£ÊxVb ÔBå£DGjÓï%ÂÒ 0Ãclû™Ì'"vËÔ´F2ÖE2&Â0õ*LªÆ ºä -Y¦ˆ @FÞão3lç€-1&&»¢Œ*f(j[úYîqs>Î0v01l£ -_º‘iMXÛ…ßÿÝÿ¡þ€ÿèàJ­osj±É¸í#xYø¨¤F^Î -ü¯èu|"Aþ@GGzC™ÛsËÁ© q „V²ò„.¯?Ýþ‘kÈog9ä7WÜ°ß8¿ -pü£à2H€ö"È?5f ÍØ(iW¤ND¾sí‰m.Ž5ö­ñ¤½®7ÄRžëp5 Ï7û¼4 ûS,õÖlêÝ"Ô®iM¿âT6›:&QðKe“üi#vRˆê xuœ½Õ­aWÑ è`h_uµƒ6x€OÓ\;À6jd@; xCÿ Ú¶ÍÎ XD™š¢*giÒ{eëp¦8‘¢Ú¾¾üÈßÙ¿C[û—Î -dœR>1ÐÏÞÕ[2ª"=M<¢Û¸+ò²Óv2Yî ½ûí_vÈU,|xôÊØsÿõÿ •¯.¦|ÜGÔ’wŠ1ò!§ääbrÑ0CÐâAh›¦xç’y_ì8é‘ Å¿Ø¹Cå×ФE;ZÍrç«÷¸Ä’·ðMlˆÉ]/"<U¡›¹hM!ááy l¸'£—H3?üþë?¦jhQ0~º/"•Òé‰73DA8…×ë¿ÿúžlXß ÌEÿ˜“›³Ëœ² m8Xä<8$%Æí̘ωBt#u„Š'*õÞ˜QR˜k3”)±æ\ÝšpŒ|XÎlt~+© „br~93„#/zæ†oƒÖ bÀ,kgr¡cY¿Å6ì£Ã0ì£SdØG§à°ÎŽaLý;…úwŠ»À©h¹¬“ÀdáÒ [?dp'P“‰F ±-6æ‘>+±«. ºŒÕ^„e,gÝClÑ6ÕŽnÅýTž+ÿÿ{dÀáa¸€66oÚég<=ØÑPÂgÑñø!ù{ä_üUòçØ3¨ÖÎѺƒ¿øÿPKÂß–XkûPK×.f8 -styles.xmlí]ݎ㸕¾Ÿ§<Ø\­lIv¹ìJWIÏvf€žÞFW5{Ð2m+#K†~Êå¾J‹Å^ì+ìîE^ `0“É3¸Ÿ$¯CR”¨?[’-»ªšÝ@U™<<<{47ØŒéV¡gSª©ÙÃ6&•ù=½«÷8í¨ª|„VÉ —ìUV -PΪþݼ²GÜÍKTc.WÙ7(qÚ¼ýiuóö§bÙ% -%6õ¾…LúãÛW‰/x˪uÚ”ªLÏZUn&£Ë»®‹J -°¥âš6è±Ïõz'ùÚ³ì äæNrÙf¬qwY¤4 Ó{@¡â;â¦%êBRýÖó/ÞKÍ\è¡fÈÄ꛶9Ê3æ`qŽÂ>E]wÞC`’8ƒ/q¢¥eoÒy ‹•˜`ß;äY¤SHå?ò1Øã^õ7ˉkwz{%¸a„ùêã ±0ÉRçØÁžºõÜ%rZ•.Öbˆø3´rýŸ 4,áÌ2ÿø)”¥W°H€¼r«Ä™ÿª°ÖR¶Ê;Ç‚±+ßÞD:Ø_Ï-Z€.ô‚JXN/Üг°§¼ÆëRó4̳„FxNé-èhÔ·‘5s-Hr¹žh‘B¡É•]¥¢Á‹ü“{ByþÚòýª­M„/UvÓFÚÒ)/þãmU í)¥,ó•C½ä0Ѩ£EbU:Bõ;­STPÈ1$zšÖ)7Èñy×V¤&Mñ‰ÄdeQèG]èôtl5mü/¢§†jª&À³^)ãàŒÍa§x†B;šRò -"ÉæZ-,“€»˜>JSWÀI/° § “«+¦îZ…j+¨÷×­Û7Aä‚ÌM&†ó@…‰Vý2Ũ ׳>@MHÑNâ;"†™'ì]•kŽ´€g¤Ú±¶‚…Ê&¾3dû‘õ¹†VÈCTK¢ŽX)£¢0pI=àÖ»ŒÙ«EìT”‰‡L,ý< à9ÝùD¸îØžLR^a9SL&d‘@l”ÊÉ…5˜Ý]ù‘ø½rùÅöÑFäšúôâ33ÔèÚ.ÌA/„hœ¹L<ßúbëÆ* i6ræ!šC’ÒÓ -Àÿxû.Õ,RN…¹rxéHQž÷áþžgE¬xŽã:8Ï’Ì[m|_Â4Î-`çQÆ,ú{U1Òbwöz¨i±Y-°n×Qm4´¨R¹ˆ4`ö¥·¥¢Ã­BÇ BÆp -Ù0 -%€ßì÷HîDêÔ‚ØtH%z׸ГIûì -4›Ž—þ$Ø15ß8ÔÏ3î1ÅÃJ«>I«=«`\8ªÓŠž„y‘u//‘åÐ9 ÷1#G´ -ýE†äàˆ Ë}©h )¢£°Á‰ë‘ ÞÝ5¸‰V>qÝ㈠zîº@ HÍåw¯ÔÀã`AßHÐUA¬:žý:SäM;¥½7¬|…ªÔq°îÀ¶æ cI9£ß†~`Í6*Q´n -:=Âõ ³p &~\[–ñ§ê½QÑèÕNW ·Þèçè Œ§Ðì÷ÿ[pƒßÚo&îtÃ¥†áee£šP(bviˆ@B¼c¢‡WÝ(Z"ÆFˆu'52Î%i7È** FÝ€¬º -·añí€&9$D‚"•ÔîîÀèïn{Ü)R¸ìP¸Œì5ÚøU‚~D?0` 9Õ = ¦©¿Æˆ,Ø›Å>Q(F+±+¸8Ñ€å†Å6¾#C¬QÇYl< rQâYóE>5ò«aÿ¢Ì¯—k:ÑrEõ³bd´VS™I™6}xJ4m™^&®=-wÖQÆYY)žMË6wÅÑnW=0WµëŠ;º8]Š®XÃ¥Ž×÷Åi¤Ìí³z/ÇLåF…kzÎ+˜ó5q‰£‘MX6RÑÞ¼AXÔ£ hˆ‡ö{,=%ÁöðéŽwF4‡ú?ßâ×JVtXj6™KìúV@wnGÝÁx”¸l°Yô&4ÚÝ«ÈCvÇãq– +΃ë<-Þ¾õ¦ê–z麴Ôc°Ô-™<“ÈaÊNÂ{B¦diNgØz ? H" Rwnm¤æÖF§¦{ÕWr›©©©1vÒSãw7¥H;¿+[Š’µú(9ö—ìr— I­ñ¨Ì-k»èQxVpƒ#Zz/˜,À‹Ù±ÕšÊhEzœóÇ­ e±ÛfñC%KQuÀ›Q¼íC@3àÂÕ#¡‚8¿>üïýÝÀ¢üŽ<.7³é^]Ë¥¹ôSlê›p4µvÊMê˜Ú\@§ £QkƒX¥Q©åéë;½û:>Q@´þÊJ–ð3ë'1"*ÌÁÒ>èˆsˆh÷v©]!ÚBMƒ¾@ßdEO‰>Sž+4eßqà•p6t‰&ÞˆR£5šl2•2›(ÔÞ1•©løåH#ÿ[AZ̧‡Yÿ|·0/v½aýdû¿ÛÛ·‚ŸÛþ´ýáò zl°*:Äø@PUÕ=¹ãõ:Û?lÿBíÿñÓ÷Û¶ýô?-ÛÿÆÜ«ä#døYEÈž=ðÏ1DZv€SX³í¹1òyÇHËðbd cäóŽ‘–à)ÄH_ÆÈç#-;ÀSˆ‘ÃuÉyô1Ò²<…ÑeŒ|Þ1Ò²<ÆÎjêäÇkH-ÙsˆÎlêŠHÓÎÁÍ#í-]]¿,8PƒX†¦Pí?¬} ·Ÿ]Ý?ü@îkêt‘™ÙM%¥bJ%C‡‰ìðövÖö«Ð¶q°·*F¶³žZ¯øHa¼cw7u1H±A -‹Çq·‹AL4®¿%ó -Ù&u˜Ù¥OEJäTŠHRY‡ôHýîÓ—ü#ûYaèL±Ç¾ôˆ ßµ­i Ý«‹¾¥VLÕDµCÿ®«‘÷ïGàžÆ‡\/^¥Uw‹ë¯»‡¼ç¬Ô)¶˜¹sxñóÖbÿƒŽ¬15÷?hGèØÄK’j -08†Â¥YÀ¤ãzKñ»ÓÕ|`'Ää,û€Q¿ÿeú»8·‡çàòÜŒÎ-ÀøÜèÚù$øåÄGÁ•#sß\xÖLü‚\ -`¸ý¿O¿‡™øßaFN~þ™@›OÿýéwÛŸ>ýç§ïÉ'˜®ý‘NØþkû±ðdy( ¥¨t -ñÞ¿WÙÚÈvG†+ÍFÔú#f3G=ª¨ Ž$·ñ"¼¾›ä$HߘÎMÔ$R5¶¾™w€ŠfB4 ¬³i¬I`]cMfNgÓX“ ÊÑ5vvø<"›õÏj³zèbx¼Èþ::ü¹8LÀÜÑ›P±îæ÷û’=iÙ¾ˆK>¼k·.*¡ÄäŠHÛš®‡é:w„£2:?€^nü¡Xþ‡ÕÅÔ3hÿ0ƒæÎ}]>"}]>}‘¾F@_º~ö¨£ì (Á‘¦©guK/ÿUç7­¢Ÿ&Ì_z(ä°âkôì%rÌ…ë©ì†2ñ¬âÝüêž_³oRW.²«ë ¹mãøüAt“d®ðT¹ùET£tINÞeYüEuå’‹SÜU.Ã#7R&§ œÌÓ’Ç'‡ô½Bn ›šþ÷k¦ØÜ9½Saº9’s:ç±Áº¯«óõoRÝÇW7U¿ø5NÎ¤Ó a£[üÙémvC¬.¨D%O7¢àºÃ -Wâ`Ì¡0‡ÁÁ.æ0<˜ÃåÁFsÌA× -YP<ÄÉ%¶ƒl”/ÉMÄh9Ƀ)Z·?Òùmñer°ø(Ž&<­¸u„f -"RÊè›5ƒ§ -—ýT…Ëþ ªÂe Uá²?˜ªpÙPU¸ìª*\öV.ûƒ«’×¥Ìg3 †¿no½rØÑ÷Ô †’Ã.»d>‘Ñ¡x~}*K$B2‰½Šñh+SÅ(EÚRŽ©­øNþ㨫^×ÁäaÅ_+hª ƚϸh~üºAm%é]ãò,:êïБюŽúu4ÖÎãHƒv1h¨£{18‹.ÚÑÃEC=ô»úåybØŽ"†AàéõpÙŽ.êaÐ Îã£v1j¨ˆ‹®6:‹ÆíèaÜX—úyⳡ@˜®ãc3 ¬;Ε^ÑJŸÙÛ¥» ûbp¨–`áˆnF­´ãE_»îüãûOX튔ڃµà)r+®vNxÚzÓªl¥m(¶Ò´‚ýZjÛC€s­4í ´VÚö0@WKM“8ªe58%ŽH%q”ÄQGI%q”ÄQG=uqJu!q”ÄQGI%q”ÄQGIõtpÔð”8j(q”ÄQGI%q”ÄQGIõtpÔå)qÔåIpTáGÂ( £$Œ’0JÂ( £$Œ’0ª)ŒFär”ÄQGI%q”ÄQGIõtpÔø”8j,q”ÄQGI%q”ÄQGIõtpiè途ø&h«HêrP¹+“HJ")‰¤$’’HJ")‰¤$’Ú¤7À>¹&|fÍC–ë(q†jÚÈ÷¯;3× -Èçârd„¼@½CvHÐJ”È úä¾p‹0'ׂÏqªL ÍTÂoêšá2¹¿ºØ™–ÉhË(Ô@®\Nä(ª‰fª„ÎoS§9îlæã€e0›Ë]:Š˜$º°ñ,ˆò,Çô0i8©ˆdÏzÀÙ2£ Ó}’% 0p¯eªqVùÝõorÏ<ä®u‡ìÜkh©¯1šboç“3¶íªýÒÔÈÿNö q-z/ÝFÎ<«_w¼°ÃÊ…Nà(oßu² ”¿1þ*4­)Rnã+ïËt§XO§$×2’§Ÿ ¹E P˜‘/ž}Êíœ^Ís±¬'ïqOðù#§]¿Ì&k½KT}~˜›öóÎk×£óLêít©kÊ_6\»mOÆÍŸŸ¢oïrä–Ÿõ²å§oòö–EåÛný}=ï}fî÷s©WŸÙþ»>¯÷´`ÿÔ­|é[s*o¿Ør¯9ûî>©„éɹõW¦m®ÒðÝÆ›SöîHþ—“Ç+N¿Øbcò.&-^ÉÎä¹[¯Ÿ×¾¶ùѶí‹™›f½0ݸuÏ‹‚ý›Ö]tX½‡M.;ÑwcÕ¤C^Ä?D¨Ÿ’hê“MôØ¡Êé9™É—%^«ƒö=ŠÍ¢Ç>ÑÇb'ó0‘¨ Í•6´x xJó ]‡Ž4_Q–ƒja+ж <†Qö â€6"à'Ž\ -ÚŠh¢XÐßó¨ÇbPÖ×L²©Q§ÚQCJ‘Ýñ˜HÅøÒíX -wðe‘ÙShˆø f°ØôÄ4|­5¹djáUXzJœŽÖm3Äø‰Á [ …$[(\ž1¨\¬÷Œ¯(ðÚ—aS0ùªÛ¨,uµ˜‘ê ÃøR¢IìæütÕAö…(ÅJO—ÙVô—z?ÄÄ-®@þ¾Ï ’‰íÌYáDZXÒ;µÊ“aN›\ôkB -†Ÿ‰6|¼°i¥_¸™þb2a¢©€½ºNeâ>BÄJ¨Ý~)ö’Ã~Ͳ[`²‰ÅÕíú”³¬@£Hìº -m´+B×w*ËË 4Yð:Q˜ÈWm.pY\Xm±‘Þ^º«¨c ^-ŧ´Ÿ\ÙÞV¶>^®m}ÙmüPKd= ÁPK×.f8META-INF/manifest.xmlµ—ßr£ Åïûï£@£Ó¤#þ¹Þ‹îPCRfnóö‹É¤íÚLg»›ÏpFÏóqP¸xí»Å‹Ôjà ¡Z½“ê° ~>6Ëu𰽻﹒{al~é,ü{ʼÝn7ª\s#M®x/LnÛ\Bítëz¡lþçóùDÚÞ-Þ…÷²Kÿàx\¼ÃÄNò¥=bðaèdË­gô¢vá‰~D„V¼Úàýí½ëºåÀíó&ˆ‚è[°ë*¥V{ypãi†DÆrëÌaäyÛŠNø[=F­ÇÉ¢¯"8 °ï4·H|Ѓ|ü¨£0p3= -LÜj݉˞„‰˜´= (ã›Úóï…qjZ=¡“aûðwc¸‰±²µÎ)"È_1.¦f•Ðfj Ž×FëUÓðW¿ ’ÕúLdõÔâ&Á­h‰’19ãš]ˆ´®|§Ä@Ä×óª6©·X1å‘â¹Ç 5IVÌ#™{,hM3šÕP=“äâ±öQ-3Z€e5žgµ"¤Be—Õt>UA²&‹("^Ï«Zá„eeVe•Ì=â$-«†A%'ö‹a–ULŠÊ#b'o¤Á§u‰½¹¢a £t -E,ê9±Š Šë -l?'§^!FŒÀ<Æsþÿ“¤€ú †?UµÆ)K@Vÿcsñ$×õ;~ÔÎ.[Þ>‹o"¦ÃL4m÷¯ -û-Œý·óÀ׺Æ;an.Û Ëovvy|vý“â²3‘½tÃAn-~Û -ký™ú­´÷ѧ#õö7PKëŠxtSPK×.f8^Æ2 ''mimetypePK×.f8MConfigurations2/statusbar/PK×.f8'…Configurations2/accelerator/current.xmlPK×.f8ÜConfigurations2/floater/PK×.f8Configurations2/popupmenu/PK×.f8JConfigurations2/progressbar/PK×.f8„Configurations2/menubar/PK×.f8ºConfigurations2/toolbar/PK×.f8ðConfigurations2/images/Bitmaps/PK×.f8A¢ˆ|" |T--Pictures/2000041A0000356F0000214891083746.wmfPK×.f8–˜+¹è(2-ªPictures/20000238000035BE00001F511036C053.wmfPK×.f8`”<6 -”4-íPictures/20000258000034EB00001F516ED001C1.wmfPK×.f8‰×ïU% ¤T-~$Pictures/2000041E0000356F00002148F76C0DB2.wmfPK×.f8eW~Ä -\5-þ0Pictures/20000261000034EB00001F5190F59A27.wmfPK×.f8ªæm“F |T-?Pictures/200004120000356F00002148A6E6969E.wmfPK×.f8¬ý-ü\"--¾KPictures/200002060000355500001F51E083C96A.wmfPK×.f87oâØ1-uRPictures/20000234000035BE00001F51D22D0CD3.wmfPK×.f8€‰n:MŠ4-²ZPictures/20000257000034EB00001F51DA29F945.wmfPK×.f8W}†ö˜ l.-ZiPictures/200002180000355500001F51D15B9C9D.wmfPK×.f8ˆU\ Å -f5-MsPictures/20000262000034EB00001F51157CDFBE.wmfPK×.f8³Âž‰šT-mPictures/200004190000356F0000214816F2BAAD.wmfPK×.f8ˆÑIØlX-Q’Pictures/200000BB00002F1100001DFBAFB5B668.wmfPK×.f8\Ýn€èT-„šPictures/200000AE00002F1100001DFBD4204EDD.wmfPK×.f8õ -üê3b.-_¢Pictures/200002180000355500001F51E30B6F10.wmfPK×.f8IÓ$@R-íªPictures/200000A400002F1100001DFB1A0425AA.wmfPK×.f8ü]œˆU-ˆ²Pictures/200000B100002F1100001DFBDE17B70E.wmfPK×.f8ƒ<¥Œg ºlayout-cachePK×.f8Âß–Xkû »content.xmlPK×.f8‹8ÌûåÄè -ïstyles.xmlPK×.f8Ìùx{3 'meta.xmlPK×.f8P¿(·§u)Thumbnails/thumbnail.pngPK×.f8d= Á r,settings.xmlPK×.f8ëŠxtSm1META-INF/manifest.xmlPK!!3 -4 \ No newline at end of file
trunk/doc/hssdrc_design_document_rev10.odt Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/doc/hssdrc_design_document.pdf =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: trunk/doc/hssdrc_design_document.pdf =================================================================== --- trunk/doc/hssdrc_design_document.pdf (revision 2) +++ trunk/doc/hssdrc_design_document.pdf (nonexistent)
trunk/doc/hssdrc_design_document.pdf Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: trunk/sim/compile.do =================================================================== --- trunk/sim/compile.do (revision 2) +++ trunk/sim/compile.do (nonexistent) @@ -1,59 +0,0 @@ - -set need_quit 1 -set need_del 1 - -set debug 1 - -if {$debug} { - set opt novopt -} else { - set opt O4 -} -# -#set used project dir -# -set prjdir E:/work_des00/Project/prj_10_hssdrc - -set coredir $prjdir/core -set rtldir $prjdir/rtl -set tbdir $prjdir/testbench -set incdir $prjdir/include - -if {$need_del} { - vdel -all work -} - -vlib work -# core codes -vlog $coredir/mt48lc2m32b2.v -# headers codes -# rtl codes -vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_data_path.v -vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_data_path_p1.v -vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_addr_path.v -vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_addr_path_p1.v -vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_mux.v -vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_init_state.v -vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_arbiter_out.v -vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_access_manager.v -vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_decoder_state.v -vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_decoder.v -vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_ba_map.v -vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_arbiter_in.v -vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_refr_counter.v -vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_top.v - -# tb codes -vlog -$opt -sv -lint +incdir+$incdir+$tbdir $tbdir/sdram_interpretator.sv - -vlog -$opt -sv -lint +incdir+$incdir+$tbdir $tbdir/tb_prog.sv -vlog -$opt -sv -lint +incdir+$incdir+$tbdir $tbdir/tb_top.sv - -if {$need_quit} { - quit -} - - - - -
trunk/sim/compile.do Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/sim/sim.do =================================================================== --- trunk/sim/sim.do (revision 2) +++ trunk/sim/sim.do (nonexistent) @@ -1,133 +0,0 @@ - -onbreak {resume} - -proc r {} { - restart -force -all -} - -transcript file "" - -set debug 1 - -if {$debug} { - set seed [clock seconds] -} else { - set seed [clock seconds] -} - -#transcript file transcript - -if {$debug} { -vsim -novopt -sv_seed $seed -wlf hssdrc_work.wlf work.tb_top - -onerror {resume} -quietly WaveActivateNextPane {} 0 - -radix hexadecimal - -add wave -noupdate -divider system -add wave -noupdate -format Logic /tb_top/clk -add wave -noupdate -format Logic /tb_top/reset -add wave -noupdate -format Logic /tb_top/sclr - -add wave -noupdate -divider sys_if_req_resp -add wave -noupdate -format Logic /tb_top/sys_write -add wave -noupdate -format Logic /tb_top/sys_read -add wave -noupdate -format Logic /tb_top/sys_refr -add wave -noupdate -format Logic /tb_top/sys_ready - -add wave -noupdate -divider sys_if_req_data -add wave -noupdate -format Literal /tb_top/sys_rowa -add wave -noupdate -format Literal /tb_top/sys_cola -add wave -noupdate -format Literal /tb_top/sys_ba -add wave -noupdate -format Literal /tb_top/sys_burst -add wave -noupdate -format Literal /tb_top/sys_chid_i - -add wave -noupdate -divider sys_if_data -add wave -noupdate -format Literal /tb_top/sys_wdata -add wave -noupdate -format Literal /tb_top/sys_wdatam -add wave -noupdate -format Logic /tb_top/sys_use_wdata - -add wave -noupdate -format Logic /tb_top/sys_chid_o -add wave -noupdate -format Literal /tb_top/sys_rdata -add wave -noupdate -format Logic /tb_top/sys_vld_rdata - -add wave -noupdate -divider sdram_if -add wave -noupdate -format Logic /tb_top/nclk -add wave -noupdate -format Literal /tb_top/inter/cmd_e -add wave -noupdate -format Literal /tb_top/dq -add wave -noupdate -format Literal /tb_top/dqm -add wave -noupdate -format Literal /tb_top/addr -add wave -noupdate -format Literal /tb_top/ba -add wave -noupdate -format Logic /tb_top/cs_n -add wave -noupdate -format Logic /tb_top/ras_n -add wave -noupdate -format Logic /tb_top/cas_n -add wave -noupdate -format Logic /tb_top/we_n - -add wave -noupdate -divider am -add wave -noupdate -format Logic /tb_top/top/access_manager/am_pre_all_enable -add wave -noupdate -format Logic /tb_top/top/access_manager/am_refr_enable -add wave -noupdate -format Literal /tb_top/top/access_manager/am_pre_enable -add wave -noupdate -format Literal /tb_top/top/access_manager/am_act_enable -add wave -noupdate -format Literal /tb_top/top/access_manager/am_read_enable -add wave -noupdate -format Literal /tb_top/top/access_manager/am_write_enable - -add wave -noupdate -divider mux -add wave -noupdate -format Logic /tb_top/top/mux/mux_pre_all -add wave -noupdate -format Logic /tb_top/top/mux/mux_refr -add wave -noupdate -format Logic /tb_top/top/mux/mux_pre -add wave -noupdate -format Logic /tb_top/top/mux/mux_act -add wave -noupdate -format Logic /tb_top/top/mux/mux_read -add wave -noupdate -format Logic /tb_top/top/mux/mux_write -add wave -noupdate -format Logic /tb_top/top/mux/mux_lmr -add wave -noupdate -format Literal /tb_top/top/mux/mux_burst - -add wave -noupdate -divider state -add wave -noupdate -format Literal /tb_top/top/decoder/state0/state -add wave -noupdate -format Literal /tb_top/top/decoder/state1/state -add wave -noupdate -format Literal /tb_top/top/decoder/state2/state - -add wave -noupdate -divider ba_map -add wave -noupdate -format Logic /tb_top/top/ba_map/update -add wave -noupdate -format Logic /tb_top/top/ba_map/clear -add wave -noupdate -format Literal /tb_top/top/ba_map/ba -add wave -noupdate -format Literal /tb_top/top/ba_map/rowa -add wave -noupdate -format Logic /tb_top/top/ba_map/pre_act_rw -add wave -noupdate -format Logic /tb_top/top/ba_map/act_rw -add wave -noupdate -format Logic /tb_top/top/ba_map/rw -add wave -noupdate -format Logic /tb_top/top/ba_map/all_close - -add wave -noupdate -divider init_state -add wave -noupdate -format Logic /tb_top/top/init_state/init_done - -add wave -noupdate -divider refr_cnt -add wave -noupdate -format Logic /tb_top/top/refr_cnt/ack -add wave -noupdate -format Logic /tb_top/top/refr_cnt/hi_req -add wave -noupdate -format Logic /tb_top/top/refr_cnt/low_req - - - -TreeUpdate [SetDefaultTree] -configure wave -namecolwidth 203 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 -configure wave -gridoffset 0 -configure wave -gridperiod 1 -configure wave -griddelta 40 -configure wave -timeline 0 -update -WaveRestoreZoom {0 ps} {1000 ps} - -log -r /* - -} else { - vsim -sv_seed $seed work.tb_top - run -all - quit -} -
trunk/sim/sim.do Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/core/test.v =================================================================== --- trunk/core/test.v (revision 2) +++ trunk/core/test.v (nonexistent) @@ -1,367 +0,0 @@ -// Testbench for Micron SDR SDRAM Verilog models - -`timescale 1ns / 1ps - -module test; - -reg [31 : 0] dq; // SDRAM I/O -reg [10 : 0] addr; // SDRAM Address -reg [1 : 0] ba; // Bank Address -reg clk; // Clock -reg cke; // Synchronous Clock Enable -reg cs_n; // CS# -reg ras_n; // RAS# -reg cas_n; // CAS# -reg we_n; // WE# -reg [3 : 0] dqm; // I/O Mask - -wire [31 : 0] DQ = dq; - -parameter hi_z = 32'bz; // Hi-Z - -parameter tCK = 10; // Clock Period - -mt48lc2m32b2 sdram0 (DQ, addr, ba, clk, cke, cs_n, ras_n, cas_n, we_n, dqm); - -initial begin - clk = 1'b0; - cke = 1'b0; - cs_n = 1'b1; - dq = hi_z; -end - -always #5 clk = ~clk; - -/* -always @ (posedge clk) begin - $strobe("at time %t clk=%b cke=%b CS#=%b RAS#=%b CAS#=%b WE#=%b dqm=%b addr=%b ba=%b DQ=%d", - $time, clk, cke, cs_n, ras_n, cas_n, we_n, dqm, addr, ba, DQ); -end -*/ - -task active; - input [1 : 0] bank; - input [10 : 0] row; - input [31 : 0] dq_in; - begin - cke = 1; - cs_n = 0; - ras_n = 0; - cas_n = 1; - we_n = 1; - dqm = 0; - ba = bank; - addr = row; - dq = dq_in; - end -endtask - -task auto_refresh; - begin - cke = 1; - cs_n = 0; - ras_n = 0; - cas_n = 0; - we_n = 1; - dqm = 0; - //ba = 0; - //addr = 0; - dq = hi_z; - end -endtask - -task burst_term; - input [31 : 0] dq_in; - begin - cke = 1; - cs_n = 0; - ras_n = 1; - cas_n = 1; - we_n = 0; - dqm = 0; - //ba = 0; - //addr = 0; - dq = dq_in; - end -endtask - -task load_mode_reg; - input [10 : 0] op_code; - begin - cke = 1; - cs_n = 0; - ras_n = 0; - cas_n = 0; - we_n = 0; - dqm = 0; - ba = 0; - addr = op_code; - dq = hi_z; - end -endtask - -task nop; - input [3 : 0] dqm_in; - input [31 : 0] dq_in; - begin - cke = 1; - cs_n = 0; - ras_n = 1; - cas_n = 1; - we_n = 1; - dqm = dqm_in; - //ba = 0; - //addr = 0; - dq = dq_in; - end -endtask - -task precharge_bank_0; - input [3 : 0] dqm_in; - input [31 : 0] dq_in; - begin - cke = 1; - cs_n = 0; - ras_n = 0; - cas_n = 1; - we_n = 0; - dqm = dqm_in; - ba = 0; - addr = 0; - dq = dq_in; - end -endtask - -task precharge_bank_1; - input [3 : 0] dqm_in; - input [31 : 0] dq_in; - begin - cke = 1; - cs_n = 0; - ras_n = 0; - cas_n = 1; - we_n = 0; - dqm = dqm_in; - ba = 1; - addr = 0; - dq = dq_in; - end -endtask - -task precharge_bank_2; - input [3 : 0] dqm_in; - input [31 : 0] dq_in; - begin - cke = 1; - cs_n = 0; - ras_n = 0; - cas_n = 1; - we_n = 0; - dqm = dqm_in; - ba = 2; - addr = 0; - dq = dq_in; - end -endtask - -task precharge_bank_3; - input [3 : 0] dqm_in; - input [31 : 0] dq_in; - begin - cke = 1; - cs_n = 0; - ras_n = 0; - cas_n = 1; - we_n = 0; - dqm = dqm_in; - ba = 3; - addr = 0; - dq = dq_in; - end -endtask - -task precharge_all_bank; - input [3 : 0] dqm_in; - input [31 : 0] dq_in; - begin - cke = 1; - cs_n = 0; - ras_n = 0; - cas_n = 1; - we_n = 0; - dqm = dqm_in; - ba = 0; - addr = 1024; // A10 = 1 - dq = dq_in; - end -endtask - -task read; - input [1 : 0] bank; - input [10 : 0] column; - input [31 : 0] dq_in; - input [3 : 0] dqm_in; - begin - cke = 1; - cs_n = 0; - ras_n = 1; - cas_n = 0; - we_n = 1; - dqm = dqm_in; - ba = bank; - addr = column; - dq = dq_in; - end -endtask - -task write; - input [1 : 0] bank; - input [10 : 0] column; - input [31 : 0] dq_in; - input [3 : 0] dqm_in; - begin - cke = 1; - cs_n = 0; - ras_n = 1; - cas_n = 0; - we_n = 0; - dqm = dqm_in; - ba = bank; - addr = column; - dq = dq_in; - end -endtask - -initial begin - begin - // Initialize - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; precharge_all_bank(0, hi_z); // Precharge ALL Bank - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; auto_refresh; // Auto Refresh - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; auto_refresh; // Auto Refresh - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; load_mode_reg (50); // Load Mode: Lat = 3, BL = 4, Seq - #tCK; nop (0, hi_z); // Nop - - // Write with auto precharge to bank 0 (non-interrupt) - #tCK; active (0, 0, hi_z); // Active: Bank = 0, Row = 0 - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; write (0, 1024, 100, 0); // Write : Bank = 0, Col = 0, Dqm = 0, Auto Precharge - #tCK; nop (0, 101); // Nop - #tCK; nop (0, 102); // Nop - #tCK; nop (0, 103); // Nop - #tCK; nop (0, hi_z); // Nop - - // Write with auto precharge to bank 1 (non-interrupt) - #tCK; active (1, 0, hi_z); // Active: Bank = 1, Row = 0 - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; write (1, 1024, 200, 0); // Write : Bank = 1, Col = 0, Dqm = 0, Auto precharge - #tCK; nop (0, 201); // Nop - #tCK; nop (0, 202); // Nop - #tCK; nop (0, 203); // Nop - #tCK; nop (0, hi_z); // Nop - - // Write with auto precharge to bank 2 (non-interrupt) - #tCK; active (2, 0, hi_z); // Active: Bank = 2, Row = 0 - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; write (2, 1024, 300, 0); // Write : Bank = 2, Col = 0, Dqm = 0, Auto Precharge - #tCK; nop (0, 301); // Nop - #tCK; nop (0, 302); // Nop - #tCK; nop (0, 303); // Nop - #tCK; nop (0, hi_z); // Nop - - // Write with auto precharge to bank 3 (non-interrupt) - #tCK; active (3, 0, hi_z); // Active: Bank = 3, Row = 0 - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; write (3, 1024, 400, 0); // Write : Bank = 3, Col = 0, Dqm = 0, Auto precharge - #tCK; nop (0, 401); // Nop - #tCK; nop (0, 402); // Nop - #tCK; nop (0, 403); // Nop - #tCK; nop (0, hi_z); // Nop - - // Read with auto precharge to bank 0 (non-interrupt) - #tCK; active (0, 0, hi_z); // Active: Bank = 0, Row = 0 - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; read (0, 1024, hi_z, 0); // Read : Bank = 0, Col = 0, Dqm = 0, Auto precharge - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - - // Read with auto precharge to bank 1 (non-interrupt) - #tCK; active (1, 0, hi_z); // Active: Bank = 1, Row = 0 - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; read (1, 1024, hi_z, 0); // Read : Bank = 1, Col = 0, Dqm = 0, Auto precharge - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - - // Read with auto precharge to bank 2 (non-interrupt) - #tCK; active (2, 0, hi_z); // Active: Bank = 2, Row = 0 - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; read (2, 1024, hi_z, 0); // Read : Bank = 2, Col = 0, Dqm = 0, Auto precharge - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - - // Read with auto precharge to bank 3 (non-interrupt) - #tCK; active (3, 0, hi_z); // Active: Bank = 3, Row = 0 - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; read (3, 1024, hi_z, 0); // Read : Bank = 3, Col = 0, Dqm = 0, Auto precharge - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; nop (0, hi_z); // Nop - #tCK; - end -$stop; -$finish; -end - -endmodule - -
trunk/core/test.v Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/core/mt48lc2m32b2.v =================================================================== --- trunk/core/mt48lc2m32b2.v (revision 2) +++ trunk/core/mt48lc2m32b2.v (nonexistent) @@ -1,1096 +0,0 @@ -/************************************************************************** -* -* File Name: MT48LC2M32B2.V -* Version: 2.1 -* Date: June 6th, 2002 -* Model: BUS Functional -* Simulator: Model Technology -* -* Dependencies: None -* -* Email: modelsupport@micron.com -* Company: Micron Technology, Inc. -* Model: MT48LC2M32B2 (512K x 32 x 4 Banks) -* -* Description: Micron 64Mb SDRAM Verilog model -* -* Limitation: - Doesn't check for 4096 cycle refresh -* -* Note: - Set simulator resolution to "ps" accuracy -* - Set Debug = 0 to disable $display messages -* -* Disclaimer: THESE DESIGNS ARE PROVIDED "AS IS" WITH NO WARRANTY -* WHATSOEVER AND MICRON SPECIFICALLY DISCLAIMS ANY -* IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR -* A PARTICULAR PURPOSE, OR AGAINST INFRINGEMENT. -* -* Copyright © 2001 Micron Semiconductor Products, Inc. -* All rights researved -* -* Rev Author Date Changes -* --- -------------------------- --------------------------------------- -* 2.1 SH 06/06/2002 - Typo in bank multiplex -* Micron Technology Inc. -* -* 2.0 SH 04/30/2002 - Second release -* Micron Technology Inc. -* -**************************************************************************/ - -`timescale 1ns / 1ps - -module mt48lc2m32b2 (Dq, Addr, Ba, Clk, Cke, Cs_n, Ras_n, Cas_n, We_n, Dqm); - - parameter addr_bits = 11; - parameter data_bits = 32; - parameter col_bits = 8; - parameter mem_sizes = 524287; - - inout [data_bits - 1 : 0] Dq; - input [addr_bits - 1 : 0] Addr; - input [1 : 0] Ba; - input Clk; - input Cke; - input Cs_n; - input Ras_n; - input Cas_n; - input We_n; - input [3 : 0] Dqm; - - reg [data_bits - 1 : 0] Bank0 [0 : mem_sizes]; - reg [data_bits - 1 : 0] Bank1 [0 : mem_sizes]; - reg [data_bits - 1 : 0] Bank2 [0 : mem_sizes]; - reg [data_bits - 1 : 0] Bank3 [0 : mem_sizes]; - - reg [1 : 0] Bank_addr [0 : 3]; // Bank Address Pipeline - reg [col_bits - 1 : 0] Col_addr [0 : 3]; // Column Address Pipeline - reg [3 : 0] Command [0 : 3]; // Command Operation Pipeline - reg [3 : 0] Dqm_reg0, Dqm_reg1; // DQM Operation Pipeline - reg [addr_bits - 1 : 0] B0_row_addr, B1_row_addr, B2_row_addr, B3_row_addr; - - reg [addr_bits - 1 : 0] Mode_reg; - reg [data_bits - 1 : 0] Dq_reg, Dq_dqm; - reg [col_bits - 1 : 0] Col_temp, Burst_counter; - - reg Act_b0, Act_b1, Act_b2, Act_b3; // Bank Activate - reg Pc_b0, Pc_b1, Pc_b2, Pc_b3; // Bank Precharge - - reg [1 : 0] Bank_precharge [0 : 3]; // Precharge Command - reg A10_precharge [0 : 3]; // Addr[10] = 1 (All banks) - reg Auto_precharge [0 : 3]; // RW Auto Precharge (Bank) - reg Read_precharge [0 : 3]; // R Auto Precharge - reg Write_precharge [0 : 3]; // W Auto Precharge - reg RW_interrupt_read [0 : 3]; // RW Interrupt Read with Auto Precharge - reg RW_interrupt_write [0 : 3]; // RW Interrupt Write with Auto Precharge - reg [1 : 0] RW_interrupt_bank; // RW Interrupt Bank - integer RW_interrupt_counter [0 : 3]; // RW Interrupt Counter - integer Count_precharge [0 : 3]; // RW Auto Precharge Counter - - reg Data_in_enable; - reg Data_out_enable; - - reg [1 : 0] Bank, Prev_bank; - reg [addr_bits - 1 : 0] Row; - reg [col_bits - 1 : 0] Col, Col_brst; - - // Internal system clock - reg CkeZ, Sys_clk; - - // Commands Decode - wire Active_enable = ~Cs_n & ~Ras_n & Cas_n & We_n; - wire Aref_enable = ~Cs_n & ~Ras_n & ~Cas_n & We_n; - wire Burst_term = ~Cs_n & Ras_n & Cas_n & ~We_n; - wire Mode_reg_enable = ~Cs_n & ~Ras_n & ~Cas_n & ~We_n; - wire Prech_enable = ~Cs_n & ~Ras_n & Cas_n & ~We_n; - wire Read_enable = ~Cs_n & Ras_n & ~Cas_n & We_n; - wire Write_enable = ~Cs_n & Ras_n & ~Cas_n & ~We_n; - - // Burst Length Decode - wire Burst_length_1 = ~Mode_reg[2] & ~Mode_reg[1] & ~Mode_reg[0]; - wire Burst_length_2 = ~Mode_reg[2] & ~Mode_reg[1] & Mode_reg[0]; - wire Burst_length_4 = ~Mode_reg[2] & Mode_reg[1] & ~Mode_reg[0]; - wire Burst_length_8 = ~Mode_reg[2] & Mode_reg[1] & Mode_reg[0]; - wire Burst_length_f = Mode_reg[2] & Mode_reg[1] & Mode_reg[0]; - - // CAS Latency Decode - wire Cas_latency_1 = ~Mode_reg[6] & ~Mode_reg[5] & Mode_reg[4]; - wire Cas_latency_2 = ~Mode_reg[6] & Mode_reg[5] & ~Mode_reg[4]; - wire Cas_latency_3 = ~Mode_reg[6] & Mode_reg[5] & Mode_reg[4]; - - // Write Burst Mode - wire Write_burst_mode = Mode_reg[9]; - - wire Debug = 1'b1; // Debug messages : 1 = On - wire Dq_chk = Sys_clk & Data_in_enable; // Check setup/hold time for DQ - - assign Dq = Dq_reg; // DQ buffer - - // Commands Operation - `define ACT 0 - `define NOP 1 - `define READ 2 - `define WRITE 3 - `define PRECH 4 - `define A_REF 5 - `define BST 6 - `define LMR 7 - - // Timing Parameters for -6 CL3 - parameter tAC = 5.5; - parameter tHZ = 5.5; - parameter tOH = 2.5; - parameter tMRD = 2.0; // 2 Clk Cycles - parameter tRAS = 42.0; - parameter tRC = 60.0; - parameter tRCD = 18.0; - parameter tRFC = 60.0; - parameter tRP = 18.0; - parameter tRRD = 12.0; - parameter tWRa = 6.0; // A2 Version - Auto precharge mode (1 Clk + 7 ns) - parameter tWRm = 12.0; // A2 Version - Manual precharge mode (14 ns) - - // Timing Check variable - time MRD_chk; - time WR_chkm [0 : 3]; - time RFC_chk, RRD_chk; - time RC_chk0, RC_chk1, RC_chk2, RC_chk3; - time RAS_chk0, RAS_chk1, RAS_chk2, RAS_chk3; - time RCD_chk0, RCD_chk1, RCD_chk2, RCD_chk3; - time RP_chk0, RP_chk1, RP_chk2, RP_chk3; - - initial begin - Dq_reg = {data_bits{1'bz}}; - Data_in_enable = 0; Data_out_enable = 0; - Act_b0 = 1; Act_b1 = 1; Act_b2 = 1; Act_b3 = 1; - Pc_b0 = 0; Pc_b1 = 0; Pc_b2 = 0; Pc_b3 = 0; - WR_chkm[0] = 0; WR_chkm[1] = 0; WR_chkm[2] = 0; WR_chkm[3] = 0; - RW_interrupt_read[0] = 0; RW_interrupt_read[1] = 0; RW_interrupt_read[2] = 0; RW_interrupt_read[3] = 0; - RW_interrupt_write[0] = 0; RW_interrupt_write[1] = 0; RW_interrupt_write[2] = 0; RW_interrupt_write[3] = 0; - MRD_chk = 0; RFC_chk = 0; RRD_chk = 0; - RAS_chk0 = 0; RAS_chk1 = 0; RAS_chk2 = 0; RAS_chk3 = 0; - RCD_chk0 = 0; RCD_chk1 = 0; RCD_chk2 = 0; RCD_chk3 = 0; - RC_chk0 = 0; RC_chk1 = 0; RC_chk2 = 0; RC_chk3 = 0; - RP_chk0 = 0; RP_chk1 = 0; RP_chk2 = 0; RP_chk3 = 0; - $timeformat (-9, 1, " ns", 12); - end - - // System clock generator - always begin - @ (posedge Clk) begin - Sys_clk = CkeZ; - CkeZ = Cke; - end - @ (negedge Clk) begin - Sys_clk = 1'b0; - end - end - - always @ (posedge Sys_clk) begin - // Internal Commamd Pipelined - Command[0] = Command[1]; - Command[1] = Command[2]; - Command[2] = Command[3]; - Command[3] = `NOP; - - Col_addr[0] = Col_addr[1]; - Col_addr[1] = Col_addr[2]; - Col_addr[2] = Col_addr[3]; - Col_addr[3] = {col_bits{1'b0}}; - - Bank_addr[0] = Bank_addr[1]; - Bank_addr[1] = Bank_addr[2]; - Bank_addr[2] = Bank_addr[3]; - Bank_addr[3] = 2'b0; - - Bank_precharge[0] = Bank_precharge[1]; - Bank_precharge[1] = Bank_precharge[2]; - Bank_precharge[2] = Bank_precharge[3]; - Bank_precharge[3] = 2'b0; - - A10_precharge[0] = A10_precharge[1]; - A10_precharge[1] = A10_precharge[2]; - A10_precharge[2] = A10_precharge[3]; - A10_precharge[3] = 1'b0; - - // Dqm pipeline for Read - Dqm_reg0 = Dqm_reg1; - Dqm_reg1 = Dqm; - - // Read or Write with Auto Precharge Counter - if (Auto_precharge[0] === 1'b1) begin - Count_precharge[0] = Count_precharge[0] + 1; - end - if (Auto_precharge[1] === 1'b1) begin - Count_precharge[1] = Count_precharge[1] + 1; - end - if (Auto_precharge[2] === 1'b1) begin - Count_precharge[2] = Count_precharge[2] + 1; - end - if (Auto_precharge[3] === 1'b1) begin - Count_precharge[3] = Count_precharge[3] + 1; - end - - // Read or Write Interrupt Counter - if (RW_interrupt_write[0] === 1'b1) begin - RW_interrupt_counter[0] = RW_interrupt_counter[0] + 1; - end - if (RW_interrupt_write[1] === 1'b1) begin - RW_interrupt_counter[1] = RW_interrupt_counter[1] + 1; - end - if (RW_interrupt_write[2] === 1'b1) begin - RW_interrupt_counter[2] = RW_interrupt_counter[2] + 1; - end - if (RW_interrupt_write[3] === 1'b1) begin - RW_interrupt_counter[3] = RW_interrupt_counter[3] + 1; - end - - // tMRD Counter - MRD_chk = MRD_chk + 1; - - // Auto Refresh - if (Aref_enable === 1'b1) begin - if (Debug) begin - $display ("%m : at time %t AREF : Auto Refresh", $time); - end - - // Auto Refresh to Auto Refresh - if ($time - RFC_chk < tRFC) begin - $display ("%m : at time %t ERROR: tRFC violation during Auto Refresh", $time); - end - - // Precharge to Auto Refresh - if (($time - RP_chk0 < tRP) || ($time - RP_chk1 < tRP) || - ($time - RP_chk2 < tRP) || ($time - RP_chk3 < tRP)) begin - $display ("%m : at time %t ERROR: tRP violation during Auto Refresh", $time); - end - - // Precharge to Refresh - if (Pc_b0 === 1'b0 || Pc_b1 === 1'b0 || Pc_b2 === 1'b0 || Pc_b3 === 1'b0) begin - $display ("%m : at time %t ERROR: All banks must be Precharge before Auto Refresh", $time); - end - - // Load Mode Register to Auto Refresh - if (MRD_chk < tMRD) begin - $display ("%m : at time %t ERROR: tMRD violation during Auto Refresh", $time); - end - - // Record Current tRFC time - RFC_chk = $time; - end - - // Load Mode Register - if (Mode_reg_enable === 1'b1) begin - // Register Mode - Mode_reg = Addr; - - // Decode CAS Latency, Burst Length, Burst Type, and Write Burst Mode - if (Debug) begin - $display ("%m : at time %t LMR : Load Mode Register", $time); - // CAS Latency - case (Addr[6 : 4]) - 3'b001 : $display ("%m : CAS Latency = 1"); - 3'b010 : $display ("%m : CAS Latency = 2"); - 3'b011 : $display ("%m : CAS Latency = 3"); - default : $display ("%m : CAS Latency = Reserved"); - endcase - - // Burst Length - case (Addr[2 : 0]) - 3'b000 : $display ("%m : Burst Length = 1"); - 3'b001 : $display ("%m : Burst Length = 2"); - 3'b010 : $display ("%m : Burst Length = 4"); - 3'b011 : $display ("%m : Burst Length = 8"); - 3'b111 : $display ("%m : Burst Length = Full"); - default : $display ("%m : Burst Length = Reserved"); - endcase - - // Burst Type - if (Addr[3] === 1'b0) begin - $display ("%m : Burst Type = Sequential"); - end else if (Addr[3] === 1'b1) begin - $display ("%m : Burst Type = Interleaved"); - end else begin - $display ("%m : Burst Type = Reserved"); - end - - // Write Burst Mode - if (Addr[9] === 1'b0) begin - $display ("%m : Write Burst Mode = Programmed Burst Length"); - end else if (Addr[9] === 1'b1) begin - $display ("%m : Write Burst Mode = Single Location Access"); - end else begin - $display ("%m : Write Burst Mode = Reserved"); - end - end - - // Precharge to Load Mode Register - if (Pc_b0 === 1'b0 && Pc_b1 === 1'b0 && Pc_b2 === 1'b0 && Pc_b3 === 1'b0) begin - $display ("%m : at time %t ERROR: all banks must be Precharge before Load Mode Register", $time); - end - - // Precharge to Load Mode Register - if (($time - RP_chk0 < tRP) || ($time - RP_chk1 < tRP) || - ($time - RP_chk2 < tRP) || ($time - RP_chk3 < tRP)) begin - $display ("%m : at time %t ERROR: tRP violation during Load Mode Register", $time); - end - - // Auto Refresh to Load Mode Register - if ($time - RFC_chk < tRFC) begin - $display ("%m : at time %t ERROR: tRFC violation during Load Mode Register", $time); - end - - // Load Mode Register to Load Mode Register - if (MRD_chk < tMRD) begin - $display ("%m : at time %t ERROR: tMRD violation during Load Mode Register", $time); - end - - // Reset MRD Counter - MRD_chk = 0; - end - - // Active Block (Latch Bank Address and Row Address) - if (Active_enable === 1'b1) begin - // Activate an open bank can corrupt data - if ((Ba === 2'b00 && Act_b0 === 1'b1) || (Ba === 2'b01 && Act_b1 === 1'b1) || - (Ba === 2'b10 && Act_b2 === 1'b1) || (Ba === 2'b11 && Act_b3 === 1'b1)) begin - $display ("%m : at time %t ERROR: Bank already activated -- data can be corrupted", $time); - end - - // Activate Bank 0 - if (Ba === 2'b00 && Pc_b0 === 1'b1) begin - // Debug Message - if (Debug) begin - $display ("%m : at time %t ACT : Bank = 0 Row = %d", $time, Addr); - end - - // ACTIVE to ACTIVE command period - if ($time - RC_chk0 < tRC) begin - $display ("%m : at time %t ERROR: tRC violation during Activate bank 0", $time); - end - - // Precharge to Activate Bank 0 - if ($time - RP_chk0 < tRP) begin - $display ("%m : at time %t ERROR: tRP violation during Activate bank 0", $time); - end - - // Record variables - Act_b0 = 1'b1; - Pc_b0 = 1'b0; - B0_row_addr = Addr [addr_bits - 1 : 0]; - RAS_chk0 = $time; - RC_chk0 = $time; - RCD_chk0 = $time; - end - - if (Ba == 2'b01 && Pc_b1 == 1'b1) begin - // Debug Message - if (Debug) begin - $display ("%m : at time %t ACT : Bank = 1 Row = %d", $time, Addr); - end - - // ACTIVE to ACTIVE command period - if ($time - RC_chk1 < tRC) begin - $display ("%m : at time %t ERROR: tRC violation during Activate bank 1", $time); - end - - // Precharge to Activate Bank 1 - if ($time - RP_chk1 < tRP) begin - $display ("%m : at time %t ERROR: tRP violation during Activate bank 1", $time); - end - - // Record variables - Act_b1 = 1'b1; - Pc_b1 = 1'b0; - B1_row_addr = Addr [addr_bits - 1 : 0]; - RAS_chk1 = $time; - RC_chk1 = $time; - RCD_chk1 = $time; - end - - if (Ba == 2'b10 && Pc_b2 == 1'b1) begin - // Debug Message - if (Debug) begin - $display ("%m : at time %t ACT : Bank = 2 Row = %d", $time, Addr); - end - - // ACTIVE to ACTIVE command period - if ($time - RC_chk2 < tRC) begin - $display ("%m : at time %t ERROR: tRC violation during Activate bank 2", $time); - end - - // Precharge to Activate Bank 2 - if ($time - RP_chk2 < tRP) begin - $display ("%m : at time %t ERROR: tRP violation during Activate bank 2", $time); - end - - // Record variables - Act_b2 = 1'b1; - Pc_b2 = 1'b0; - B2_row_addr = Addr [addr_bits - 1 : 0]; - RAS_chk2 = $time; - RC_chk2 = $time; - RCD_chk2 = $time; - end - - if (Ba == 2'b11 && Pc_b3 == 1'b1) begin - // Debug Message - if (Debug) begin - $display ("%m : at time %t ACT : Bank = 3 Row = %d", $time, Addr); - end - - // ACTIVE to ACTIVE command period - if ($time - RC_chk3 < tRC) begin - $display ("%m : at time %t ERROR: tRC violation during Activate bank 3", $time); - end - - // Precharge to Activate Bank 3 - if ($time - RP_chk3 < tRP) begin - $display ("%m : at time %t ERROR: tRP violation during Activate bank 3", $time); - end - - // Record variables - Act_b3 = 1'b1; - Pc_b3 = 1'b0; - B3_row_addr = Addr [addr_bits - 1 : 0]; - RAS_chk3 = $time; - RC_chk3 = $time; - RCD_chk3 = $time; - end - - // Active Bank A to Active Bank B - if ((Prev_bank != Ba) && ($time - RRD_chk < tRRD)) begin - $display ("%m : at time %t ERROR: tRRD violation during Activate bank = %d", $time, Ba); - end - - // Auto Refresh to Activate - if ($time - RFC_chk < tRFC) begin - $display ("%m : at time %t ERROR: tRFC violation during Activate bank = %d", $time, Ba); - end - - // Load Mode Register to Active - if (MRD_chk < tMRD ) begin - $display ("%m : at time %t ERROR: tMRD violation during Activate bank = %d", $time, Ba); - end - - // Record variables for checking violation - RRD_chk = $time; - Prev_bank = Ba; - end - - // Precharge Block - if (Prech_enable == 1'b1) begin - // Load Mode Register to Precharge - if ($time - MRD_chk < tMRD) begin - $display ("%m : at time %t ERROR: tMRD violaiton during Precharge", $time); - end - - // Precharge Bank 0 - if ((Addr[10] === 1'b1 || (Addr[10] === 1'b0 && Ba === 2'b00)) && Act_b0 === 1'b1) begin - Act_b0 = 1'b0; - Pc_b0 = 1'b1; - RP_chk0 = $time; - - // Activate to Precharge - if ($time - RAS_chk0 < tRAS) begin - $display ("%m : at time %t ERROR: tRAS violation during Precharge", $time); - end - - // tWR violation check for write - if ($time - WR_chkm[0] < tWRm) begin - $display ("%m : at time %t ERROR: tWR violation during Precharge", $time); - end - end - - // Precharge Bank 1 - if ((Addr[10] === 1'b1 || (Addr[10] === 1'b0 && Ba === 2'b01)) && Act_b1 === 1'b1) begin - Act_b1 = 1'b0; - Pc_b1 = 1'b1; - RP_chk1 = $time; - - // Activate to Precharge - if ($time - RAS_chk1 < tRAS) begin - $display ("%m : at time %t ERROR: tRAS violation during Precharge", $time); - end - - // tWR violation check for write - if ($time - WR_chkm[1] < tWRm) begin - $display ("%m : at time %t ERROR: tWR violation during Precharge", $time); - end - end - - // Precharge Bank 2 - if ((Addr[10] === 1'b1 || (Addr[10] === 1'b0 && Ba === 2'b10)) && Act_b2 === 1'b1) begin - Act_b2 = 1'b0; - Pc_b2 = 1'b1; - RP_chk2 = $time; - - // Activate to Precharge - if ($time - RAS_chk2 < tRAS) begin - $display ("%m : at time %t ERROR: tRAS violation during Precharge", $time); - end - - // tWR violation check for write - if ($time - WR_chkm[2] < tWRm) begin - $display ("%m : at time %t ERROR: tWR violation during Precharge", $time); - end - end - - // Precharge Bank 3 - if ((Addr[10] === 1'b1 || (Addr[10] === 1'b0 && Ba === 2'b11)) && Act_b3 === 1'b1) begin - Act_b3 = 1'b0; - Pc_b3 = 1'b1; - RP_chk3 = $time; - - // Activate to Precharge - if ($time - RAS_chk3 < tRAS) begin - $display ("%m : at time %t ERROR: tRAS violation during Precharge", $time); - end - - // tWR violation check for write - if ($time - WR_chkm[3] < tWRm) begin - $display ("%m : at time %t ERROR: tWR violation during Precharge", $time); - end - end - - // Terminate a Write Immediately (if same bank or all banks) - if (Data_in_enable === 1'b1 && (Bank === Ba || Addr[10] === 1'b1)) begin - Data_in_enable = 1'b0; - end - - // Precharge Command Pipeline for Read - if (Cas_latency_3 === 1'b1) begin - Command[2] = `PRECH; - Bank_precharge[2] = Ba; - A10_precharge[2] = Addr[10]; - end else if (Cas_latency_2 === 1'b1) begin - Command[1] = `PRECH; - Bank_precharge[1] = Ba; - A10_precharge[1] = Addr[10]; - end else if (Cas_latency_1 === 1'b1) begin - Command[0] = `PRECH; - Bank_precharge[0] = Ba; - A10_precharge[0] = Addr[10]; - end - end - - // Burst terminate - if (Burst_term === 1'b1) begin - // Terminate a Write Immediately - if (Data_in_enable == 1'b1) begin - Data_in_enable = 1'b0; - end - - // Terminate a Read Depend on CAS Latency - if (Cas_latency_3 === 1'b1) begin - Command[2] = `BST; - end else if (Cas_latency_2 == 1'b1) begin - Command[1] = `BST; - end else if (Cas_latency_1 == 1'b1) begin - Command[0] = `BST; - end - - // Display debug message - if (Debug) begin - $display ("%m : at time %t BST : Burst Terminate",$time); - end - end - - // Read, Write, Column Latch - if (Read_enable === 1'b1) begin - // Check to see if bank is open (ACT) - if ((Ba == 2'b00 && Pc_b0 == 1'b1) || (Ba == 2'b01 && Pc_b1 == 1'b1) || - (Ba == 2'b10 && Pc_b2 == 1'b1) || (Ba == 2'b11 && Pc_b3 == 1'b1)) begin - $display("%m : at time %t ERROR: Bank is not Activated for Read", $time); - end - - // Activate to Read or Write - if ((Ba == 2'b00) && ($time - RCD_chk0 < tRCD) || - (Ba == 2'b01) && ($time - RCD_chk1 < tRCD) || - (Ba == 2'b10) && ($time - RCD_chk2 < tRCD) || - (Ba == 2'b11) && ($time - RCD_chk3 < tRCD)) begin - $display("%m : at time %t ERROR: tRCD violation during Read", $time); - end - - // CAS Latency pipeline - if (Cas_latency_3 == 1'b1) begin - Command[2] = `READ; - Col_addr[2] = Addr; - Bank_addr[2] = Ba; - end else if (Cas_latency_2 == 1'b1) begin - Command[1] = `READ; - Col_addr[1] = Addr; - Bank_addr[1] = Ba; - end else if (Cas_latency_1 == 1'b1) begin - Command[0] = `READ; - Col_addr[0] = Addr; - Bank_addr[0] = Ba; - end - - // Read interrupt Write (terminate Write immediately) - if (Data_in_enable == 1'b1) begin - Data_in_enable = 1'b0; - - // Interrupting a Write with Autoprecharge - if (Auto_precharge[RW_interrupt_bank] == 1'b1 && Write_precharge[RW_interrupt_bank] == 1'b1) begin - RW_interrupt_write[RW_interrupt_bank] = 1'b1; - RW_interrupt_counter[RW_interrupt_bank] = 0; - - // Display debug message - if (Debug) begin - $display ("%m : at time %t NOTE : Read interrupt Write with Autoprecharge", $time); - end - end - end - - // Read with Auto Precharge - if (Addr[10] == 1'b1) begin - Auto_precharge[Ba] = 1'b1; - Count_precharge[Ba] = 0; - RW_interrupt_bank = Ba; - Read_precharge[Ba] = 1'b1; - end - end - - // Write Command - if (Write_enable == 1'b1) begin - // Activate to Write - if ((Ba == 2'b00 && Pc_b0 == 1'b1) || (Ba == 2'b01 && Pc_b1 == 1'b1) || - (Ba == 2'b10 && Pc_b2 == 1'b1) || (Ba == 2'b11 && Pc_b3 == 1'b1)) begin - $display("%m : at time %t ERROR: Bank is not Activated for Write", $time); - end - - // Activate to Read or Write - if ((Ba == 2'b00) && ($time - RCD_chk0 < tRCD) || - (Ba == 2'b01) && ($time - RCD_chk1 < tRCD) || - (Ba == 2'b10) && ($time - RCD_chk2 < tRCD) || - (Ba == 2'b11) && ($time - RCD_chk3 < tRCD)) begin - $display("%m : at time %t ERROR: tRCD violation during Read", $time); - end - - // Latch Write command, Bank, and Column - Command[0] = `WRITE; - Col_addr[0] = Addr; - Bank_addr[0] = Ba; - - // Write interrupt Write (terminate Write immediately) - if (Data_in_enable == 1'b1) begin - Data_in_enable = 1'b0; - - // Interrupting a Write with Autoprecharge - if (Auto_precharge[RW_interrupt_bank] == 1'b1 && Write_precharge[RW_interrupt_bank] == 1'b1) begin - RW_interrupt_write[RW_interrupt_bank] = 1'b1; - - // Display debug message - if (Debug) begin - $display ("%m : at time %t NOTE : Read Bank %d interrupt Write Bank %d with Autoprecharge", $time, Ba, RW_interrupt_bank); - end - end - end - - // Write interrupt Read (terminate Read immediately) - if (Data_out_enable == 1'b1) begin - Data_out_enable = 1'b0; - - // Interrupting a Read with Autoprecharge - if (Auto_precharge[RW_interrupt_bank] == 1'b1 && Read_precharge[RW_interrupt_bank] == 1'b1) begin - RW_interrupt_read[RW_interrupt_bank] = 1'b1; - - // Display debug message - if (Debug) begin - $display ("%m : at time %t NOTE : Write Bank %d interrupt Read Bank %d with Autoprecharge", $time, Ba, RW_interrupt_bank); - end - end - end - - // Write with Auto Precharge - if (Addr[10] == 1'b1) begin - Auto_precharge[Ba] = 1'b1; - Count_precharge[Ba] = 0; - RW_interrupt_bank = Ba; - Write_precharge[Ba] = 1'b1; - end - end - - /* - Write with Auto Precharge Calculation - The device start internal precharge when: - 1. Meet minimum tRAS requirement - and 2. tWR cycle(s) after last valid data - or 3. Interrupt by a Read or Write (with or without Auto Precharge) - - Note: Model is starting the internal precharge 1 cycle after they meet all the - requirement but tRP will be compensate for the time after the 1 cycle. - */ - if ((Auto_precharge[0] == 1'b1) && (Write_precharge[0] == 1'b1)) begin - if ((($time - RAS_chk0 >= tRAS) && // Case 1 - (((Burst_length_1 == 1'b1 || Write_burst_mode == 1'b1) && Count_precharge [0] >= 1) || // Case 2 - (Burst_length_2 == 1'b1 && Count_precharge [0] >= 2) || - (Burst_length_4 == 1'b1 && Count_precharge [0] >= 4) || - (Burst_length_8 == 1'b1 && Count_precharge [0] >= 8))) || - (RW_interrupt_write[0] == 1'b1 && RW_interrupt_counter[0] >= 1)) begin // Case 3 - Auto_precharge[0] = 1'b0; - Write_precharge[0] = 1'b0; - RW_interrupt_write[0] = 1'b0; - Pc_b0 = 1'b1; - Act_b0 = 1'b0; - RP_chk0 = $time + tWRa; - if (Debug) begin - $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 0", $time); - end - end - end - if ((Auto_precharge[1] == 1'b1) && (Write_precharge[1] == 1'b1)) begin - if ((($time - RAS_chk1 >= tRAS) && // Case 1 - (((Burst_length_1 == 1'b1 || Write_burst_mode == 1'b1) && Count_precharge [1] >= 1) || // Case 2 - (Burst_length_2 == 1'b1 && Count_precharge [1] >= 2) || - (Burst_length_4 == 1'b1 && Count_precharge [1] >= 4) || - (Burst_length_8 == 1'b1 && Count_precharge [1] >= 8))) || - (RW_interrupt_write[1] == 1'b1 && RW_interrupt_counter[1] >= 1)) begin // Case 3 - Auto_precharge[1] = 1'b0; - Write_precharge[1] = 1'b0; - RW_interrupt_write[1] = 1'b0; - Pc_b1 = 1'b1; - Act_b1 = 1'b0; - RP_chk1 = $time + tWRa; - if (Debug) begin - $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 1", $time); - end - end - end - if ((Auto_precharge[2] == 1'b1) && (Write_precharge[2] == 1'b1)) begin - if ((($time - RAS_chk2 >= tRAS) && // Case 1 - (((Burst_length_1 == 1'b1 || Write_burst_mode == 1'b1) && Count_precharge [2] >= 1) || // Case 2 - (Burst_length_2 == 1'b1 && Count_precharge [2] >= 2) || - (Burst_length_4 == 1'b1 && Count_precharge [2] >= 4) || - (Burst_length_8 == 1'b1 && Count_precharge [2] >= 8))) || - (RW_interrupt_write[2] == 1'b1 && RW_interrupt_counter[2] >= 1)) begin // Case 3 - Auto_precharge[2] = 1'b0; - Write_precharge[2] = 1'b0; - RW_interrupt_write[2] = 1'b0; - Pc_b2 = 1'b1; - Act_b2 = 1'b0; - RP_chk2 = $time + tWRa; - if (Debug) begin - $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 2", $time); - end - end - end - if ((Auto_precharge[3] == 1'b1) && (Write_precharge[3] == 1'b1)) begin - if ((($time - RAS_chk3 >= tRAS) && // Case 1 - (((Burst_length_1 == 1'b1 || Write_burst_mode == 1'b1) && Count_precharge [3] >= 1) || // Case 2 - (Burst_length_2 == 1'b1 && Count_precharge [3] >= 2) || - (Burst_length_4 == 1'b1 && Count_precharge [3] >= 4) || - (Burst_length_8 == 1'b1 && Count_precharge [3] >= 8))) || - (RW_interrupt_write[3] == 1'b1 && RW_interrupt_counter[3] >= 1)) begin // Case 3 - Auto_precharge[3] = 1'b0; - Write_precharge[3] = 1'b0; - RW_interrupt_write[3] = 1'b0; - Pc_b3 = 1'b1; - Act_b3 = 1'b0; - RP_chk3 = $time + tWRa; - if (Debug) begin - $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 3", $time); - end - end - end - - // Read with Auto Precharge Calculation - // The device start internal precharge: - // 1. Meet minimum tRAS requirement - // and 2. CAS Latency - 1 cycles before last burst - // or 3. Interrupt by a Read or Write (with or without AutoPrecharge) - if ((Auto_precharge[0] == 1'b1) && (Read_precharge[0] == 1'b1)) begin - if ((($time - RAS_chk0 >= tRAS) && // Case 1 - ((Burst_length_1 == 1'b1 && Count_precharge[0] >= 1) || // Case 2 - (Burst_length_2 == 1'b1 && Count_precharge[0] >= 2) || - (Burst_length_4 == 1'b1 && Count_precharge[0] >= 4) || - (Burst_length_8 == 1'b1 && Count_precharge[0] >= 8))) || - (RW_interrupt_read[0] == 1'b1)) begin // Case 3 - Pc_b0 = 1'b1; - Act_b0 = 1'b0; - RP_chk0 = $time; - Auto_precharge[0] = 1'b0; - Read_precharge[0] = 1'b0; - RW_interrupt_read[0] = 1'b0; - if (Debug) begin - $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 0", $time); - end - end - end - if ((Auto_precharge[1] == 1'b1) && (Read_precharge[1] == 1'b1)) begin - if ((($time - RAS_chk1 >= tRAS) && - ((Burst_length_1 == 1'b1 && Count_precharge[1] >= 1) || - (Burst_length_2 == 1'b1 && Count_precharge[1] >= 2) || - (Burst_length_4 == 1'b1 && Count_precharge[1] >= 4) || - (Burst_length_8 == 1'b1 && Count_precharge[1] >= 8))) || - (RW_interrupt_read[1] == 1'b1)) begin - Pc_b1 = 1'b1; - Act_b1 = 1'b0; - RP_chk1 = $time; - Auto_precharge[1] = 1'b0; - Read_precharge[1] = 1'b0; - RW_interrupt_read[1] = 1'b0; - if (Debug) begin - $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 1", $time); - end - end - end - if ((Auto_precharge[2] == 1'b1) && (Read_precharge[2] == 1'b1)) begin - if ((($time - RAS_chk2 >= tRAS) && - ((Burst_length_1 == 1'b1 && Count_precharge[2] >= 1) || - (Burst_length_2 == 1'b1 && Count_precharge[2] >= 2) || - (Burst_length_4 == 1'b1 && Count_precharge[2] >= 4) || - (Burst_length_8 == 1'b1 && Count_precharge[2] >= 8))) || - (RW_interrupt_read[2] == 1'b1)) begin - Pc_b2 = 1'b1; - Act_b2 = 1'b0; - RP_chk2 = $time; - Auto_precharge[2] = 1'b0; - Read_precharge[2] = 1'b0; - RW_interrupt_read[2] = 1'b0; - if (Debug) begin - $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 2", $time); - end - end - end - if ((Auto_precharge[3] == 1'b1) && (Read_precharge[3] == 1'b1)) begin - if ((($time - RAS_chk3 >= tRAS) && - ((Burst_length_1 == 1'b1 && Count_precharge[3] >= 1) || - (Burst_length_2 == 1'b1 && Count_precharge[3] >= 2) || - (Burst_length_4 == 1'b1 && Count_precharge[3] >= 4) || - (Burst_length_8 == 1'b1 && Count_precharge[3] >= 8))) || - (RW_interrupt_read[3] == 1'b1)) begin - Pc_b3 = 1'b1; - Act_b3 = 1'b0; - RP_chk3 = $time; - Auto_precharge[3] = 1'b0; - Read_precharge[3] = 1'b0; - RW_interrupt_read[3] = 1'b0; - if (Debug) begin - $display("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 3", $time); - end - end - end - - // Internal Precharge or Bst - if (Command[0] == `PRECH) begin // Precharge terminate a read with same bank or all banks - if (Bank_precharge[0] == Bank || A10_precharge[0] == 1'b1) begin - if (Data_out_enable == 1'b1) begin - Data_out_enable = 1'b0; - end - end - end else if (Command[0] == `BST) begin // BST terminate a read to current bank - if (Data_out_enable == 1'b1) begin - Data_out_enable = 1'b0; - end - end - - if (Data_out_enable == 1'b0) begin - Dq_reg <= #tOH {data_bits{1'bz}}; - end - - // Detect Read or Write command - if (Command[0] == `READ) begin - Bank = Bank_addr[0]; - Col = Col_addr[0]; - Col_brst = Col_addr[0]; - case (Bank_addr[0]) - 2'b00 : Row = B0_row_addr; - 2'b01 : Row = B1_row_addr; - 2'b10 : Row = B2_row_addr; - 2'b11 : Row = B3_row_addr; - endcase - Burst_counter = 0; - Data_in_enable = 1'b0; - Data_out_enable = 1'b1; - end else if (Command[0] == `WRITE) begin - Bank = Bank_addr[0]; - Col = Col_addr[0]; - Col_brst = Col_addr[0]; - case (Bank_addr[0]) - 2'b00 : Row = B0_row_addr; - 2'b01 : Row = B1_row_addr; - 2'b10 : Row = B2_row_addr; - 2'b11 : Row = B3_row_addr; - endcase - Burst_counter = 0; - Data_in_enable = 1'b1; - Data_out_enable = 1'b0; - end - - // DQ buffer (Driver/Receiver) - if (Data_in_enable == 1'b1) begin // Writing Data to Memory - // Array buffer - case (Bank) - 2'b00 : Dq_dqm = Bank0 [{Row, Col}]; - 2'b01 : Dq_dqm = Bank1 [{Row, Col}]; - 2'b10 : Dq_dqm = Bank2 [{Row, Col}]; - 2'b11 : Dq_dqm = Bank3 [{Row, Col}]; - endcase - - // Dqm operation - if (Dqm[0] == 1'b0) begin - Dq_dqm [ 7 : 0] = Dq [ 7 : 0]; - end - if (Dqm[1] == 1'b0) begin - Dq_dqm [15 : 8] = Dq [15 : 8]; - end - if (Dqm[2] == 1'b0) begin - Dq_dqm [23 : 16] = Dq [23 : 16]; - end - if (Dqm[3] == 1'b0) begin - Dq_dqm [31 : 24] = Dq [31 : 24]; - end - - // Write to memory - case (Bank) - 2'b00 : Bank0 [{Row, Col}] = Dq_dqm; - 2'b01 : Bank1 [{Row, Col}] = Dq_dqm; - 2'b10 : Bank2 [{Row, Col}] = Dq_dqm; - 2'b11 : Bank3 [{Row, Col}] = Dq_dqm; - endcase - - // Display debug message - if (Dqm !== 4'b1111) begin - // Record tWR for manual precharge - WR_chkm [Bank] = $time; - - if (Debug) begin - $display("%m : at time %t WRITE: Bank = %d Row = %d, Col = %d, Data = %h", $time, Bank, Row, Col, Dq_dqm); - end - end else begin - if (Debug) begin - $display("%m : at time %t WRITE: Bank = %d Row = %d, Col = %d, Data = Hi-Z due to DQM", $time, Bank, Row, Col); - end - end - - // Advance burst counter subroutine - #tHZ Burst_decode; - - end else if (Data_out_enable == 1'b1) begin // Reading Data from Memory - // Array buffer - case (Bank) - 2'b00 : Dq_dqm = Bank0[{Row, Col}]; - 2'b01 : Dq_dqm = Bank1[{Row, Col}]; - 2'b10 : Dq_dqm = Bank2[{Row, Col}]; - 2'b11 : Dq_dqm = Bank3[{Row, Col}]; - endcase - - // Dqm operation - if (Dqm_reg0 [0] == 1'b1) begin - Dq_dqm [ 7 : 0] = 8'bz; - end - if (Dqm_reg0 [1] == 1'b1) begin - Dq_dqm [15 : 8] = 8'bz; - end - if (Dqm_reg0 [2] == 1'b1) begin - Dq_dqm [23 : 16] = 8'bz; - end - if (Dqm_reg0 [3] == 1'b1) begin - Dq_dqm [31 : 24] = 8'bz; - end - - // Display debug message - if (Dqm_reg0 !== 4'b1111) begin - Dq_reg = #tAC Dq_dqm; - if (Debug) begin - $display("%m : at time %t READ : Bank = %d Row = %d, Col = %d, Data = %h", $time, Bank, Row, Col, Dq_reg); - end - end else begin - Dq_reg = #tHZ {data_bits{1'bz}}; - if (Debug) begin - $display("%m : at time %t READ : Bank = %d Row = %d, Col = %d, Data = Hi-Z due to DQM", $time, Bank, Row, Col); - end - end - - // Advance burst counter subroutine - Burst_decode; - end - end - - // Burst counter decode - task Burst_decode; - begin - // Advance Burst Counter - Burst_counter = Burst_counter + 1; - - // Burst Type - if (Mode_reg[3] == 1'b0) begin // Sequential Burst - Col_temp = Col + 1; - end else if (Mode_reg[3] == 1'b1) begin // Interleaved Burst - Col_temp[2] = Burst_counter[2] ^ Col_brst[2]; - Col_temp[1] = Burst_counter[1] ^ Col_brst[1]; - Col_temp[0] = Burst_counter[0] ^ Col_brst[0]; - end - - // Burst Length - if (Burst_length_2) begin // Burst Length = 2 - Col [0] = Col_temp [0]; - end else if (Burst_length_4) begin // Burst Length = 4 - Col [1 : 0] = Col_temp [1 : 0]; - end else if (Burst_length_8) begin // Burst Length = 8 - Col [2 : 0] = Col_temp [2 : 0]; - end else begin // Burst Length = FULL - Col = Col_temp; - end - - // Burst Read Single Write - if (Write_burst_mode == 1'b1) begin - Data_in_enable = 1'b0; - end - - // Data Counter - if (Burst_length_1 == 1'b1) begin - if (Burst_counter >= 1) begin - Data_in_enable = 1'b0; - Data_out_enable = 1'b0; - end - end else if (Burst_length_2 == 1'b1) begin - if (Burst_counter >= 2) begin - Data_in_enable = 1'b0; - Data_out_enable = 1'b0; - end - end else if (Burst_length_4 == 1'b1) begin - if (Burst_counter >= 4) begin - Data_in_enable = 1'b0; - Data_out_enable = 1'b0; - end - end else if (Burst_length_8 == 1'b1) begin - if (Burst_counter >= 8) begin - Data_in_enable = 1'b0; - Data_out_enable = 1'b0; - end - end - end - endtask - - // Timing Parameters for -6 CL3 - specify - specparam - tAH = 1.0, // Addr, Ba Hold Time - tAS = 1.5, // Addr, Ba Setup Time - tCH = 2.5, // Clock High-Level Width - tCL = 2.5, // Clock Low-Level Width - tCK = 6.0, // Clock Cycle Time - tDH = 1.0, // Data-in Hold Time - tDS = 1.5, // Data-in Setup Time - tCKH = 1.0, // CKE Hold Time - tCKS = 1.5, // CKE Setup Time - tCMH = 1.0, // CS#, RAS#, CAS#, WE#, DQM# Hold Time - tCMS = 1.5; // CS#, RAS#, CAS#, WE#, DQM# Setup Time - $width (posedge Clk, tCH); - $width (negedge Clk, tCL); - $period (negedge Clk, tCK); - $period (posedge Clk, tCK); - $setuphold(posedge Clk, Cke, tCKS, tCKH); - $setuphold(posedge Clk, Cs_n, tCMS, tCMH); - $setuphold(posedge Clk, Cas_n, tCMS, tCMH); - $setuphold(posedge Clk, Ras_n, tCMS, tCMH); - $setuphold(posedge Clk, We_n, tCMS, tCMH); - $setuphold(posedge Clk, Addr, tAS, tAH); - $setuphold(posedge Clk, Ba, tAS, tAH); - $setuphold(posedge Clk, Dqm, tCMS, tCMH); - $setuphold(posedge Dq_chk, Dq, tDS, tDH); - endspecify - -endmodule
trunk/core/mt48lc2m32b2.v Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: trunk/readme.txt =================================================================== --- trunk/readme.txt (revision 2) +++ trunk/readme.txt (nonexistent) @@ -1,8 +0,0 @@ -Logical project decsription - -core - external not under development IP cores -doc - project documentation -include - common rtl, testbench header files -rtl - rtl models of project units -sim - simulation scripts for verivication -testbench - verification enviroment for project
trunk/readme.txt Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: hssdrc/trunk/testbench/sdram_interpretator.sv =================================================================== --- hssdrc/trunk/testbench/sdram_interpretator.sv (nonexistent) +++ hssdrc/trunk/testbench/sdram_interpretator.sv (revision 3) @@ -0,0 +1,115 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:54:00 $ +// +// Workfile : sdram_interpretator.sv +// +// Description : testbench only sdram command decoder +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + + +`include "hssdrc_timescale.vh" + +module sdram_interpretator (ba, cs_n, ras_n, cas_n, we_n, a10); + + input wire [1:0] ba; + input wire cs_n; + input wire ras_n; + input wire cas_n; + input wire we_n; + input wire a10; + + enum { + nop, + act0, act1, act2, act3, + rd0, rd1, rd2, rd3, + wr0, wr1, wr2, wr3, + bt, + pre0, pre1, pre2, pre3, + prea, arefr, lmr, inop, unknown + } cmd_e; + + + always_comb begin + logic [3:0] tmp; + + tmp = {cs_n, ras_n, cas_n, we_n}; + + cmd_e = unknown; + + if (cs_n) + cmd_e = inop; + else + case (tmp) + 4'b0111 : cmd_e = nop; + 4'b0011 : begin + case (ba) + 2'd1 : cmd_e = act1; + 2'd2 : cmd_e = act2; + 2'd3 : cmd_e = act3; + default : cmd_e = act0; + endcase + end + 4'b0101 : begin + case (ba) + 2'd1 : cmd_e = rd1; + 2'd2 : cmd_e = rd2; + 2'd3 : cmd_e = rd3; + default : cmd_e = rd0; + endcase + end + 4'b0100 : begin + case (ba) + 2'd1 : cmd_e = wr1; + 2'd2 : cmd_e = wr2; + 2'd3 : cmd_e = wr3; + default : cmd_e = wr0; + endcase + end + 4'b0110 : cmd_e = bt; + 4'b0010 : + if (a10) cmd_e = prea; + else begin + case (ba) + 2'd1 : cmd_e = pre1; + 2'd2 : cmd_e = pre2; + 2'd3 : cmd_e = pre3; + default : cmd_e = pre0; + endcase + end + 4'b0001 : cmd_e = arefr; + 4'b0000 : cmd_e = lmr; + default : cmd_e = unknown; + endcase + end + +endmodule
hssdrc/trunk/testbench/sdram_interpretator.sv Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/testbench/message_class.sv =================================================================== --- hssdrc/trunk/testbench/message_class.sv (nonexistent) +++ hssdrc/trunk/testbench/message_class.sv (revision 3) @@ -0,0 +1,106 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:54:00 $ +// +// Workfile : message_class.sv +// +// Description : simple message service class +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + + +`ifndef __MESSAGE_CLASS__ + + `define __MESSAGE_CLASS__ + + class message_class; + + static int fp; + + static int err_cnt; + + // + // + // + + function new (string file_name = ""); + if (file_name.len() != 0) + fp = $fopen(file_name, "w"); + else + fp = 0; + endfunction + + // + // + // + + function void stop(); + $fclose(fp); + endfunction + + // + // + // + + function void note (string str); + string io_str; + + io_str = $psprintf("**NOTE** at %0t : ", $time); + + io_str = {io_str, str}; + + $display (io_str); + if (fp) + $fdisplay (fp, io_str); + endfunction + + // + // + // + + function void err (string str); + string io_str; + + err_cnt++; + + io_str = $psprintf("**ERROR** at %0t : ", $time); + + io_str = {io_str, str}; + + $display (io_str); + if (fp) + $fdisplay (fp, io_str); + + endfunction + + endclass + +`endif
hssdrc/trunk/testbench/message_class.sv Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/testbench/sdram_agent_class.sv =================================================================== --- hssdrc/trunk/testbench/sdram_agent_class.sv (nonexistent) +++ hssdrc/trunk/testbench/sdram_agent_class.sv (revision 3) @@ -0,0 +1,173 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:54:00 $ +// +// Workfile : sdram_agent_class.sv +// +// Description : agent for connect with hssdrc controller via driver +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + + +`include "tb_define.svh" +`include "sdram_transaction_class.sv" + +class sdram_agent_class; + + // to hssdrc_driver + sdram_tr_mbx in_mbx; + + // input transaction + sdram_tr_mbx write_tr_mbx; + sdram_tr_mbx read_tr_mbx; + + // tb syncronization : transaction done numbers + int write_tr_done_num; + int read_tr_done_num; + + // acknowledge from driver + sdram_tr_ack_mbx done_mbx; + + // + // + // + + function new (sdram_tr_mbx in_mbx, sdram_tr_ack_mbx done_mbx, sdram_tr_mbx write_tr_mbx, read_tr_mbx); + + this.in_mbx = in_mbx; + + this.done_mbx = done_mbx; + + this.write_tr_mbx = write_tr_mbx; + this.read_tr_mbx = read_tr_mbx; + + endfunction + + // + // + // + + task SetTransaction (sdram_transaction_class tr); + tr_type_e_t ret_code; + + in_mbx.put (tr); + + case (tr.tr_type) + cTR_WRITE_LOCKED, cTR_READ_LOCKED, cTR_REFR_LOCKED : done_mbx.get (ret_code); + default : begin end + endcase + + endtask + + // + // + // + + task run_write_read (); + + fork + write_read(); + join_none + + endtask + + // + // + // + + task stop_write_read (); + disable this.run_write_read; + endtask + + // + // + // + + task write_read (); + const int sequental_tr_max_num = 6; + + int tr_num; + + int write_tr_max_num; + int read_tr_max_num; + + int avail_read_tr_num; + + sdram_transaction_class write_tr; + sdram_transaction_class read_tr; + + write_tr_done_num = 0; + read_tr_done_num = 0; + + forever begin + + // + // if there is something to write + // + assert ( std::randomize(write_tr_max_num) with {write_tr_max_num inside {[1:sequental_tr_max_num]};} ) + + for (tr_num = 0; tr_num < write_tr_max_num; tr_num++) begin : write_state + + if (!write_tr_mbx.try_get (write_tr)) + break; + + SetTransaction (write_tr); + + write_tr_done_num++; + end : write_state + + // + // read + // + + assert ( std::randomize(read_tr_max_num) with {read_tr_max_num inside {[1:sequental_tr_max_num]};} ); + + avail_read_tr_num = write_tr_done_num - read_tr_done_num; + + if (read_tr_max_num > avail_read_tr_num) + read_tr_max_num = avail_read_tr_num; + + for (tr_num = 0; tr_num < read_tr_max_num; tr_num++) begin : read_state + + if (!read_tr_mbx.try_get(read_tr)) + break; + + SetTransaction (read_tr); + + read_tr_done_num++; + end : read_state + + #10; + end + + endtask + +endclass
hssdrc/trunk/testbench/sdram_agent_class.sv Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/testbench/sdram_tread_class.sv =================================================================== --- hssdrc/trunk/testbench/sdram_tread_class.sv (nonexistent) +++ hssdrc/trunk/testbench/sdram_tread_class.sv (revision 3) @@ -0,0 +1,105 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:54:00 $ +// +// Workfile : sdram_tread_class.sv +// +// Description : virtual sdram treads using for sdram chip testing +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + + + +`include "tb_define.svh" + +`ifndef __SDRAM_TREAD_CLASS_SV__ + + `define __SDRAM_TREAD_CLASS_SV__ + + class sdram_tread_class; + + sdram_tread_state_s_t active_tread_state [sdram_tread_ptr_t]; + + rand sdram_tread_ptr_t curr_tread_num; // no need to constrant + + sdram_tread_ptr_t disable_tread_num [$]; + + constraint select_tread { !(curr_tread_num inside {disable_tread_num}); } + + // + // + // + + function void Init () ; + int tread_num = 0; + const int shift = clogb2(cBaMaxValue); + sdram_tread_state_s_t tread_state; + + if (active_tread_state.num != 0) + active_tread_state.delete; + + if (disable_tread_num.size != 0) + disable_tread_num = {}; + + for (int rowa = 0; rowa < cRowaMaxValue; rowa++) begin + for (int ba = 0; ba < cBaMaxValue; ba++) begin + + tread_num = (rowa << shift) + ba; + + tread_state = '{ba : ba, rowa : rowa, cola : 0}; + + active_tread_state[tread_num] = tread_state; + + end + end + + endfunction + + // + // + // + + function burst_t GetBurst (input sdram_tread_state_s_t tread_state); + + int max_burst; + + max_burst = cColaMaxValue - tread_state.cola; + + if (max_burst > cBurstMaxValue) max_burst = 16; + + assert (std::randomize(GetBurst) with {GetBurst inside {[1:max_burst]};}) + else $error ("burst generate error : max burst = %0d burst = %0d", max_burst, GetBurst ); + + endfunction + + endclass + +`endif
hssdrc/trunk/testbench/sdram_tread_class.sv Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/testbench/tb_prog.sv =================================================================== --- hssdrc/trunk/testbench/tb_prog.sv (nonexistent) +++ hssdrc/trunk/testbench/tb_prog.sv (revision 3) @@ -0,0 +1,538 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:54:00 $ +// +// Workfile : tb_prog.sv +// +// Description : testbench program for all cases +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + + +`include "hssdrc_timescale.vh" +`include "hssdrc_define.vh" +`include "hssdrc_timing.vh" +`include "tb_define.svh" + +`include "message_class.sv" + +`include "hssdrc_driver_class.sv" +`include "hssrdc_bandwidth_monitor_class.sv" +`include "hssrdc_scoreboard_class.sv" + +`include "sdram_transaction_class.sv" + +`include "sdram_tread_class.sv" +`include "sdram_agent_class.sv" + +program tb_prog (interface sys_if); + + // agent <-> driver mailbox + sdram_tr_mbx agent2drv_mbx; + sdram_tr_ack_mbx drv2agent_mbx; + + // message service + message_class msg; + + // test program -> agent mailbox + sdram_tr_mbx agent_write_mbx; + sdram_tr_mbx agent_read_mbx; + + // transaction agent class + sdram_agent_class agent; + + // virtual sdram treads + sdram_tread_class tread; + + // driver to uut + hssrdc_driver_class driver; + + // driver callbacks + hssdrc_bandwidth_monitor_class bandwidth_mon; + hssdrc_scoreboard_class scoreboard; + + event scoreboard_event; + event bandwidth_mon_event; + + initial begin + + agent2drv_mbx = new (8); + drv2agent_mbx = new (8); + + agent_write_mbx = new (8); + agent_read_mbx = new (8); + + // init objects + msg = new ("tb_hssdrc.log"); + + driver = new (sys_if, agent2drv_mbx, drv2agent_mbx); + + agent = new (agent2drv_mbx, drv2agent_mbx, agent_write_mbx, agent_read_mbx); + + tread = new ; + + bandwidth_mon = new (sys_if, bandwidth_mon_event); + + scoreboard = new (msg, scoreboard_event); + + driver.run(); + + agent.run_write_read (); + + // calibrate bandwidth monitor + + bandwidth_mon.count_mbps_mfactor(1000); + + // disable debug process inside sdram model + + force tb_top.sdram_chip.Debug = 0; + + wait (sys_if.reset == 1'b0); + + wait (sys_if.cb.ready == 1'b1); + + msg.note ("Program start"); + +`ifdef HSSDRC_NOT_SHARE_ACT_COMMAND + msg.note ("Controller use HSSDRC_NOT_SHARE_ACT_COMMAND macros"); +`endif + +`ifdef HSSDRC_SHARE_ONE_DECODER + msg.note ("Controller use HSSDRC_SHARE_ONE_DECODER macros"); +`endif + +`ifdef HSSDRC_SHARE_NONE_DECODER + msg.note ("Controller use HSSDRC_SHARE_NONE_DECODER macros"); +`endif + + //test(-1,-1); // simple_debug_test + //test(0,0); // linear_test + test(1,1); // random_test + //test(2,2); // bandwidth_measurement + + agent.stop_write_read(); + + driver.stop(); + + msg.stop(); + + $stop; + $finish (2); + + end + + // + // + // + + task test (input int start_task, end_task); + int task_num; + + sdram_transaction_class write_tr; + sdram_transaction_class read_tr; + + sdram_transaction_class rand_tr; + sdram_transaction_class tr; + + int err; + + int tr_burst; + tr_type_e_t tr_type; + int tr_id; + int tr_chid; + int tr_num; + + bit tread_end; + int next_cola; + + sdram_tread_state_s_t tread_state; // selected tread state + int tread_num; // selected tread num + + string log_str; + begin + + for (task_num = start_task; task_num <= end_task; task_num++) + begin + // + // Task -1 : manualy checking write/read transactions + // + if (task_num == -1) begin : simple_debug_test + + msg.note ($psprintf("test %0d : simple debug test", task_num)); + + // + // test for debug only + // + + tr = new (0, cTR_WRITE_LOCKED, .ba(0), .rowa(0), .cola(0), .burst(3)); + tr.GetLinearPacket(); + agent.SetTransaction(tr); + + tr = new (0, cTR_WRITE_LOCKED, .ba(0), .rowa(0), .cola(0), .burst(4)); + tr.GetLinearPacket(); + agent.SetTransaction(tr); + + tr = new (0, cTR_READ_LOCKED, .ba(0), .rowa(0), .cola(0), .burst(4), .chid(1)); + tr.GetLinearPacket(); + agent.SetTransaction(tr); + +// tr = new (0, cTR_READ, .ba(0), .rowa(1), .cola(0), .burst(2)); +// tr.GetLinearPacket(); +// agent.SetTransaction(tr); + + tr = new (0, cTR_REFR_LOCKED, .ba(0), .rowa(0)); + agent.SetTransaction(tr); + + repeat (10) @(sys_if.cb); + end : simple_debug_test + + // + // Task 0 : linear write -> read with linear data (random burst only) + // + + else if (task_num == 0) begin : linear_test + + msg.note ($psprintf("test %0d : linear write -> read with linear data", task_num)); + + // + // test for correctness. set scoreboard callbacks + // + + driver.cbs = {}; + scoreboard.start(); + driver.cbs.push_back(scoreboard); + + driver.random_delay_mode = 1; + // + // transaction generator + // + + tread.Init(); + + msg.note ($psprintf("test %0d start_task with number of treads is %0d", task_num, tread.active_tread_state.num())); + + for (tread_num = 0; tread_num < tread.active_tread_state.num(); tread_num++) begin + + // + // get tread state + // + + tread_state = tread.active_tread_state [tread_num]; + + msg.note ($psprintf("start tread %0d" , tread_num)); + + // + // full tread transaction + // + + tr_num = 0; + + do begin + // + // generate transaction + // + tr_id = tread_num; + tr_type = cTR_WRITE; + tr_burst = tread.GetBurst (tread_state); + tr_chid = tread_state.ba; + + write_tr = new (tr_id, tr_type, tread_state.ba, tread_state.rowa, tread_state.cola, tr_burst, tr_chid); + write_tr.GetLinearPacket(); + + read_tr = new write_tr; + read_tr.tr_type = cTR_READ; + // + // set transaction + // + #10; + agent_write_mbx.put (write_tr); + #10; + agent_read_mbx.put (read_tr); + // + // update tread state + // + tr_num++; + + next_cola = tread_state.cola + tr_burst; + + tread_end = (next_cola >= cColaMaxValue); + + tread_state.cola = next_cola; + + end + while (tread_end != 1); + + msg.note ($psprintf("done tread %0d. number of tread transactions %0d", tread_num, tr_num)); + + end + + // + // wait compare done + // + + do + @(scoreboard_event); + while (agent.read_tr_done_num != scoreboard.checked_tr_num); + + msg.note ($psprintf("test%0d done. Number of errors = %0d", task_num, scoreboard.check_err_num)); + + end : linear_test + + // + // Task 1 : random write -> read with random data, rowa, ba, burst, linear cola + // + + else if (task_num == 1) begin : random_test + + msg.note ($psprintf("test %0d : random write -> read with random data", task_num)); + + // + // test for correctness. set scoreboard callbacks + // + + driver.cbs = {}; + scoreboard.start(); + driver.cbs.push_back(scoreboard); + + driver.random_delay_mode = 1; + + // + // transaction generator + // + + tread.Init(); + + msg.note ($psprintf("test %0d start_task with number of treads is %0d", task_num, tread.active_tread_state.num())); + + tr_num = 0; + + do begin + + // + // select tread + // + + assert (tread.randomize()) else $error ("generate tread selection error"); + + tread_num = tread.curr_tread_num; + + tread_state = tread.active_tread_state [tread_num]; + + // + // generate transaction + // + + tr_burst = tread.GetBurst (tread_state); + tr_type = cTR_WRITE; + tr_id = tread_num; + tr_chid = tread_state.ba; + + write_tr = new (tr_id, tr_type, tread_state.ba, tread_state.rowa, tread_state.cola, tr_burst, tr_chid); + //write_tr.GetLinearPacket(); + write_tr.GetRandomPacket(); + + read_tr = new write_tr; + read_tr.tr_type = cTR_READ; + // + // set transaction + // + #10; + agent_write_mbx.put (write_tr); + #10; + agent_read_mbx.put (read_tr); + // + // update tread state + // + tr_num++; + + next_cola = tread_state.cola + tr_burst; + + tread_end = (next_cola >= cColaMaxValue); + + tread_state.cola = next_cola; + + tread.active_tread_state [tread_num] = tread_state; + // + // if tread end kill it + // + if (tread_end) begin + tread.active_tread_state.delete (tread_num); + tread.disable_tread_num.push_back (tread_num); // random pointer constrain update + msg.note ($psprintf("done tread %0d", tread_num)); + end + + if (tr_num > cTransactionMaxValue) break; + + if (tr_num % cTransactionLogPeriod == 0) + msg.note($psprintf("transaction done %0d", tr_num)); + + end + while (tread.active_tread_state.num() != 0); + + // + // wait compare done + // + + do + @(scoreboard_event); + while (agent.read_tr_done_num != scoreboard.checked_tr_num); + + msg.note ($psprintf("test%0d done. Number of errors = %0d", task_num, scoreboard.check_err_num)); + + end : random_test + + // + // Task 2 : bandwidth measurement + // + + else if (task_num == 2) begin : bandwidth_measurement + + msg.note ($psprintf("test %0d : access bandwidth measurement", task_num)); + + // + // test for perfromance. set bandwidth monitor callbacks, no random delay mode + // + + driver.cbs = {}; + driver.cbs.push_back(bandwidth_mon); + + driver.random_delay_mode = 0; + + // + // generate transactions + // + foreach ( test_mode [t] ) begin : test_mode_cycle + + msg.note ($psprintf("test %0d start %0s test mode", task_num, test_mode_name[test_mode[t]])); + + foreach (burst_mode [b]) begin : burst_cycle + + foreach (address_mode [a] ) begin : address_cycle + + time start_time; + string str; + + tr_num = 0; + start_time = $time; + + // + // init tr.generator + // + + rand_tr = new; + rand_tr.burst_random_mode = burst_mode [b]; + rand_tr.address_random_mode = address_mode [a]; + + bandwidth_mon.start(); + + do begin + + assert ( rand_tr.randomize() ) else begin + $error("test %0d : random transaction generate error", task_num); + $stop; + end + + if ( test_mode[t].write_mode) begin + write_tr = new rand_tr; + write_tr.id = tr_num++; + write_tr.tr_type = cTR_WRITE; + + agent.SetTransaction(write_tr); + end + + if ( test_mode[t].read_mode) begin + read_tr = new rand_tr; + read_tr.id = tr_num++; + read_tr.tr_type = cTR_READ; + + agent.SetTransaction(read_tr); + end + + if (tr_num % cTransactionLogPeriod == 0) + msg.note($psprintf("task %0d transaction done %0d", task_num, tr_num)); + + end + while (($time - start_time) < cPerfomanceInterval); + + // + // syncronize output for measure + // + do + @(bandwidth_mon_event); + while (tr_num != bandwidth_mon.measured_tr_num); + + // + // stop measure + // + bandwidth_mon.stop(); + + // + // logs + // + + str = $psprintf("task %0d done. %0s mode bandwith : %0s and %0s is :\n", task_num, + test_mode_name[test_mode[t]], address_mode_name [address_mode[a]], burst_mode_name [burst_mode[b]]); + + if (test_mode [t].write_mode) + str = {str, $psprintf("\t\twrite bandwidth %0f MBps, %0f %% maximum ram bandwidth\n", + bandwidth_mon.write_bandwidth, bandwidth_mon.write_bandwidth_percent)}; + + if (test_mode [t].read_mode) + str = {str, $psprintf("\t\t read bandwidth %0f MBps, %0f %% maximum ram bandwidth\n", + bandwidth_mon.read_bandwidth, bandwidth_mon.read_bandwidth_percent)}; + + if (test_mode [t].read_mode & test_mode [t].write_mode) + str = {str, $psprintf("\t\tram bandwidth %0f MBps, %0f %% maximum ram bandwidth\n", + bandwidth_mon.bandwidth, bandwidth_mon.bandwidth_percent)}; + + msg.note(str); + + end : address_cycle + + end : burst_cycle + + end : test_mode_cycle + + + end : bandwidth_measurement + + end + + msg.note ("all test done"); + + repeat (100) @(sys_if.cb); + end + + endtask + + + +endprogram
hssdrc/trunk/testbench/tb_prog.sv Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/testbench/hssrdc_driver_cbs_class.sv =================================================================== --- hssdrc/trunk/testbench/hssrdc_driver_cbs_class.sv (nonexistent) +++ hssdrc/trunk/testbench/hssrdc_driver_cbs_class.sv (revision 3) @@ -0,0 +1,71 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:54:00 $ +// +// Workfile : hssrdc_driver_cbs_class.sv +// +// Description : base class for callbacks for API driver +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + + +`include "sdram_transaction_class.sv" + +`ifndef __HSSDRC_DRIVER_CBS_CLASS__ + + `define __HSSDRC_DRIVER_CBS_CLASS__ + + class hssrdc_driver_cbs_class; + + // + // callback for command part of hssdrc_driver_class + // + + virtual task post_Command(input realtime t); + endtask + + // + // callback for write part of hssdrc_driver_class + // + + virtual task post_WriteData (input realtime t, sdram_transaction_class tr); + endtask + + // + // callback for read part of hssdrc_driver_class + // + + virtual task post_ReadData (input realtime t, sdram_transaction_class tr); + endtask + + endclass + +`endif
hssdrc/trunk/testbench/hssrdc_driver_cbs_class.sv Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/testbench/hssrdc_scoreboard_class.sv =================================================================== --- hssdrc/trunk/testbench/hssrdc_scoreboard_class.sv (nonexistent) +++ hssdrc/trunk/testbench/hssrdc_scoreboard_class.sv (revision 3) @@ -0,0 +1,142 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:54:00 $ +// +// Workfile : hssrdc_scoreboard_class.sv +// +// Description : scoreboard for test read transaction +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + + +`include "tb_define.svh" + +`include "message_class.sv" +`include "hssrdc_driver_cbs_class.sv" + +class hssdrc_scoreboard_class extends hssrdc_driver_cbs_class; + + sdram_tr_mbx out_mbx; + message_class msg; + + event done; + + function new (message_class msg, ref event done); + + this.msg = msg; + + this.done = done; + + endfunction + + int checked_tr_num; + int check_err_num; + + // + // + // + + task start (); + checked_tr_num = 0; + check_err_num = 0; + endtask + + // + // + // + + virtual task post_ReadData (input realtime t, sdram_transaction_class tr); + tb_data_t golden_data2cmp; + tb_data_t data2cmp; + + tb_chid_t golden_chid2cmp; + tb_chid_t chid2cmp; + + tb_datam_t datam; + + int burst; + + string str; + begin + + burst = tr.burst + 1; + + golden_chid2cmp = tr.chid; + + for (int i = 0; i < burst; i++) begin + + datam = tr.wdatam [i]; + + data2cmp = MaskData(tr.rdata [i], datam); + golden_data2cmp = MaskData(tr.wdata [i], datam); + + chid2cmp = tr.rchid [i]; + + if (data2cmp !== golden_data2cmp) begin + str = $psprintf("data compare error at ba = %0d, rowa = %0d, cola = %0d : ", tr.ba, tr.rowa, tr.cola); + str = {str, ($psprintf("write data %h : read data %h", golden_data2cmp, data2cmp))}; + msg.err(str); + + check_err_num++; + end + + if (chid2cmp !== golden_chid2cmp) begin + str = $psprintf("chid compare error at ba = %0d, rowa = %0d, cola = %0d : ", tr.ba, tr.rowa, tr.cola); + str = {str, ($psprintf("write chid %h : read chid %h", golden_chid2cmp, chid2cmp))}; + msg.err(str); + + check_err_num++; + end + + end + + checked_tr_num++; + -> done; + end + endtask + + // + // + // + + function data_t MaskData (input tb_data_t data, tb_datam_t datam); + if (datam == 0) + MaskData = data; + else begin + for (int m = 0; m < $size(datam); m++) begin + for (int b = 0; b < 8; b++) begin + MaskData[8*m + b] = data [8*m + b] & ~datam[m]; + end + end + end + endfunction + +endclass
hssdrc/trunk/testbench/hssrdc_scoreboard_class.sv Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/testbench/sdram_transaction_class.sv =================================================================== --- hssdrc/trunk/testbench/sdram_transaction_class.sv (nonexistent) +++ hssdrc/trunk/testbench/sdram_transaction_class.sv (revision 3) @@ -0,0 +1,220 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:54:00 $ +// +// Workfile : sdram_transaction_class.sv +// +// Description : sdram transaction structure +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + + +`include "hssdrc_define.vh" +`include "tb_define.svh" + +`ifndef __SDRAM_TRANSACTION_CLASS_SV__ + +`define __SDRAM_TRANSACTION_CLASS_SV__ + + class sdram_transaction_class; + + // transaction id + int id; + // transacton type for driver + tr_type_e_t tr_type ; + // input sdram path + rand tb_ba_t ba ; + rand tb_rowa_t rowa ; + rand tb_cola_t cola ; + rand tb_burst_t burst ; + rand tb_chid_t chid ; + // input data path + rand tb_data_t wdata [0:cBurstMaxValue-1]; + tb_datam_t wdatam [0:cBurstMaxValue-1]; + // output data path + tb_data_t rdata [0:cBurstMaxValue-1]; + tb_chid_t rchid [0:cBurstMaxValue-1]; + + // random generate controls + int burst_random_mode = 0; + int address_random_mode = 0; + // used in random generate variables + tb_ba_t last_used_ba; + tb_rowa_t last_used_rowa; + + + function new (int id = 0, tr_type_e_t tr_type = cTR_WRITE, int ba = 0, rowa = 0, cola = 0, burst = 1, chid = 0); + + this.id = id; + this.tr_type = tr_type; + this.ba = ba; + this.rowa = rowa; + this.cola = cola; + this.burst = burst - 1; + this.chid = chid; + + endfunction + + // + // function to generate linear data packet + // + + function void GetLinearPacket; + data_t tmp_data; + begin + + tmp_data = {ba, rowa, this.cola}; + + for (int i = 0; i <= burst; i++) + wdata [i] = tmp_data + i + 1; + + wdatam = '{default : 0}; + end + endfunction + + // + // + // + + function void GetRandomPacket; + data_t tmp_data; + begin + + assert ( std::randomize(wdata)) else $error ("random packet generate"); + + wdatam = '{default : 0}; + + end + endfunction + + // + // randomize callback function to store transaction addres's + // + function void post_randomize(); + last_used_ba = ba; + last_used_rowa = rowa; + endfunction + + // + // constraint for use for performance measuring + // + + // burst constraint + + // mode 0 : any birst, no cola allign + + // mode 1 : fixed burst = 1, cola allign + constraint burst_constraint_1 { (burst_random_mode == 1) -> burst == 0; } + // mode 2 : fixed burst = 2, cola allign + constraint burst_constraint_2 { (burst_random_mode == 2) -> burst == 1; } + // mode 3 : fixed burst = 4, cola allign + constraint burst_constraint_3 { (burst_random_mode == 3) -> burst == 3; } + // mode 4 : fixed burst == 8, cola allign + constraint burst_constraint_4 { (burst_random_mode == 4) -> burst == 7; } + // mode 5 : fixed burst == 16, cola allign + constraint burst_constraint_5 { (burst_random_mode == 5) -> burst == 15; } + // mode 6 : max performance burst, cola allign + constraint burst_constraint_6 { (burst_random_mode == 6) -> burst inside {0, 1, 3, 7, 15}; } + + // cola constraint + constraint cola_constraint { (burst_random_mode != 0) -> + (burst == 1) -> (cola[0] == 0); + (burst == 3) -> (cola[1:0] == 0); + (burst == 7) -> (cola[2:0] == 0); + (burst == 15) -> (cola[3:0] == 0); + } + + constraint burst_order {solve burst before cola; } + + // address constraint + + // mode 0 : same bank same row + constraint address_constraint_0 { (address_random_mode == 0) -> { + (ba == last_used_ba); + (rowa == last_used_rowa); + } + } + // mode 1 : same bank + constraint address_constraint_1 { (address_random_mode == 1) -> { + (ba == last_used_ba); + (rowa != last_used_rowa); + } + } + // mode 2 : any bank same row + constraint address_constraint_2 { (address_random_mode == 2) -> { + (ba != last_used_ba); + (rowa == last_used_rowa); + } + } + // mode 3 : linear bank same row + constraint address_constraint_3 { (address_random_mode == 3) -> { + (last_used_ba == 0) -> (ba == 1); + (last_used_ba == 1) -> (ba == 2); + (last_used_ba == 2) -> (ba == 3); + (last_used_ba == 3) -> (ba == 0); + (rowa == last_used_rowa); + } + } + // mode 4 : any bank any row + constraint address_constraint_4 { (address_random_mode == 4) -> { + (ba != last_used_ba); + (rowa != last_used_rowa); + } + } + // mode 5 : linear bank any row + constraint address_constraint_5 { (address_random_mode == 5) -> { + (last_used_ba == 0) -> (ba == 1); + (last_used_ba == 1) -> (ba == 2); + (last_used_ba == 2) -> (ba == 3); + (last_used_ba == 3) -> (ba == 0); + (rowa != last_used_rowa); + } + } + // mode 6 : ba varies more often than rowa + constraint address_constraint_6 { (address_random_mode == 6) -> { + ba dist { (ba == last_used_ba) := 1, (ba != last_used_ba) :/5}; // 1/6 const ba + rowa dist { (rowa == last_used_rowa) := 5, (rowa != last_used_rowa) :/1}; // 5/6 const rowa + } + } + // mode 7 : ba varies less often than rowa + constraint address_constraint_7 { (address_random_mode == 7) -> { + ba dist { (ba == last_used_ba) := 3, (ba != last_used_ba) :/1}; // 75% const ba + rowa dist { (rowa == last_used_rowa) := 1, (rowa != last_used_rowa) :/3}; // 25% const rowa + } + } + + endclass + // + // mailbox for connet agent with driver + // + typedef mailbox #(sdram_transaction_class) sdram_tr_mbx; + +`endif
hssdrc/trunk/testbench/sdram_transaction_class.sv Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/testbench/hssdrc_driver_class.sv =================================================================== --- hssdrc/trunk/testbench/hssdrc_driver_class.sv (nonexistent) +++ hssdrc/trunk/testbench/hssdrc_driver_class.sv (revision 3) @@ -0,0 +1,351 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:54:00 $ +// +// Workfile : hssdrc_driver_class.sv +// +// Description : low level API driver for hssdrc_controller +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + + +`include "hssdrc_tb_sys_if.vh" + +`include "hssdrc_define.vh" + +`include "tb_define.svh" + +`include "hssrdc_driver_cbs_class.sv" + +`ifndef __HSSDRC_DRIVER_SV__ + + `define __HSSDRC_DRIVER_SV__ + + class hssrdc_driver_class; + + // callback quene + hssrdc_driver_cbs_class cbs[$]; + + // mailboxes to connect with transaction agent + sdram_tr_mbx in_mbx; + + // mailbox for connect command path with data path of this driver + sdram_tr_mbx wdata_mbx; + sdram_tr_mbx rdata_mbx; + + // + virtual hssdrc_tb_sys_if sys_if; + + // acknowledge mailbox for agent. used in locked transaction only + sdram_tr_ack_mbx done_mbx; + + // feedback to tb for waiting event + event write_done; + event read_done; + + // driver work modes + bit random_delay_mode = 0; + bit debug = 0; + + // + // + // + + function new (virtual hssdrc_tb_sys_if sys_if, sdram_tr_mbx in_mbx, sdram_tr_ack_mbx done_mbx); + + this.sys_if = sys_if; + + this.in_mbx = in_mbx; + + this.done_mbx = done_mbx; + + // internal not sized mailboxes : all must be controlled via in_mbx, out_mbx size + wdata_mbx = new; + rdata_mbx = new; + + endfunction + + // + // init interface task + // + + task init; + sys_if.cb.write <= 1'b0; + sys_if.cb.read <= 1'b0; + sys_if.cb.refr <= 1'b0; + sys_if.cb.cola <= '0; + sys_if.cb.rowa <= '0; + sys_if.cb.ba <= '0; + sys_if.cb.chid_i <= '0; + sys_if.cb.burst <= '0; + sys_if.cb.wdata <= '0; + sys_if.cb.wdatam <= '0; + endtask + + // + // start driver task + // + + task run; + init (); + fork + CommandDriver (); + WriteDataDriver (); + ReadDataDriver (); + join_none; + endtask + + // + // stop driver task + // + + task stop (); + disable this.CommandDriver; + disable this.WriteDataDriver; + disable this.ReadDataDriver; + endtask + + //----------------------------------------------------------------------- + // command driver + //----------------------------------------------------------------------- + + task CommandDriver; + sdram_transaction_class tr; + + bit [4:0] delay; // max delay is 32 bit + + begin + + @(sys_if.cb); + forever begin + + // syncronize mailbox to clock + if ( !in_mbx.try_get(tr) ) begin + @(sys_if.cb); + continue; + end + + if (debug) begin + if ((tr.tr_type == cTR_READ) || (tr.tr_type == cTR_READ_LOCKED)) + $display("%0t cmd get READ transaction id = %0d", $time, tr.id); + else if ((tr.tr_type == cTR_WRITE) || (tr.tr_type == cTR_WRITE_LOCKED)) + $display("%0t cmd get WRITE transaction id = %0d", $time, tr.id); + end + + if (random_delay_mode) begin + assert (std::randomize(delay) with {delay dist {0 := 1, !0 :/ 2};}) else + $error ("random delay generate error"); + + repeat (delay) @(sys_if.cb); + end + + + // set command on interface + SetCommand(tr); + + // if need callbacks + foreach ( cbs [i] ) cbs[i].post_Command ($realtime); + + // set command for write/read drivers + case (tr.tr_type) + cTR_WRITE, cTR_WRITE_LOCKED : wdata_mbx.put (tr); + cTR_READ , cTR_READ_LOCKED : rdata_mbx.put (tr); + endcase + + // for locked transactions wait done and set acknowledge + case (tr.tr_type) + cTR_WRITE_LOCKED : begin + @(write_done); + done_mbx.put (cTR_WRITE_LOCKED); + end + cTR_READ_LOCKED : begin + @(read_done); + done_mbx.put(cTR_READ_LOCKED); + end + cTR_REFR_LOCKED : begin + done_mbx.put (cTR_WRITE_LOCKED); + end + endcase + + end + end + endtask + + // + // + // + + task SetCommand (sdram_transaction_class tr); + + case (tr.tr_type) + cTR_WRITE, cTR_WRITE_LOCKED : begin + sys_if.cb.write <= 1'b1; + sys_if.cb.read <= 1'b0; + sys_if.cb.refr <= 1'b0; + end + cTR_READ, cTR_READ_LOCKED : begin + sys_if.cb.write <= 1'b0; + sys_if.cb.read <= 1'b1; + sys_if.cb.refr <= 1'b0; + end + cTR_REFR, cTR_REFR_LOCKED : begin + sys_if.cb.write <= 1'b0; + sys_if.cb.read <= 1'b0; + sys_if.cb.refr <= 1'b1; + end + endcase + + sys_if.cb.rowa <= tr.rowa; + sys_if.cb.cola <= tr.cola; + sys_if.cb.ba <= tr.ba; + sys_if.cb.burst <= tr.burst; + sys_if.cb.chid_i <= tr.chid; + + do + @(sys_if.cb); + while (sys_if.cb.ready != 1'b1); + + sys_if.cb.write <= 1'b0; + sys_if.cb.read <= 1'b0; + sys_if.cb.refr <= 1'b0; + + endtask + + //----------------------------------------------------------------------- + // write data driver + //----------------------------------------------------------------------- + + task WriteDataDriver; + + sdram_transaction_class tr; + int num; + + begin + + forever begin + wdata_mbx.get (tr); + + if (debug) + $display("%0t write driver get transaction id = %0d", $time, tr.id); + + num = tr.burst + 1; + + // set data + for (int i = 0; i < num; i++) + SetWrData (tr.wdata [i] , tr.wdatam [i]); + + -> write_done; + + if (debug) + $display("%0t write driver done transaction id = %0d", $time, tr.id); + + foreach ( cbs[i] ) cbs[i].post_WriteData($realtime, tr); + + end + end + endtask + + // + // + // +`ifndef HSSDRC_COMBINATIVE_USE_WDATA + task SetWrData ( input data_t data, datam_t datam); + sys_if.cb.wdata <= data; + sys_if.cb.wdatam <= datam; + + do + @(sys_if.cb); + while (sys_if.cb.use_wdata != 1'b1); + endtask +`else + task SetWrData ( input data_t data, datam_t datam); + do + @(sys_if.cb); + while (sys_if.cb.use_wdata != 1'b1); + + sys_if.cb.wdata <= data; + sys_if.cb.wdatam <= datam; + endtask +`endif + //----------------------------------------------------------------------- + // read part of driver + //----------------------------------------------------------------------- + + task ReadDataDriver; + + sdram_transaction_class tr; + int num; + + begin + forever begin + rdata_mbx.get (tr); + + if (debug) + $display("%0t read driver get transaction id = %0d", $time, tr.id); + + num = tr.burst + 1; + + for (int i = 0; i < num; i++) + GetRdData (tr.rdata [i], tr.rchid [i]); + + -> read_done; + + if (debug) + $display("%0t read driver done transaction id = %0d", $time, tr.id); + + foreach ( cbs[i] ) cbs[i].post_ReadData($realtime, tr); + + end + end + endtask + + // + // + // + + task GetRdData (output data_t data, chid_t chid); + + do + @(sys_if.cb); + while (sys_if.cb.vld_rdata != 1'b1); + + data = sys_if.cb.rdata; + chid = sys_if.cb.chid_o; + + endtask + + // + // + // + + endclass + +`endif
hssdrc/trunk/testbench/hssdrc_driver_class.sv Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/testbench/hssrdc_bandwidth_monitor_class.sv =================================================================== --- hssdrc/trunk/testbench/hssrdc_bandwidth_monitor_class.sv (nonexistent) +++ hssdrc/trunk/testbench/hssrdc_bandwidth_monitor_class.sv (revision 3) @@ -0,0 +1,257 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:54:00 $ +// +// Workfile : hssrdc_bandwidth_monitor_class.sv +// +// Description : bandwidth monitor measurement class +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +`include "hssdrc_define.vh" +`include "hssdrc_timing.vh" +`include "hssdrc_tb_sys_if.vh" + +`include "sdram_transaction_class.sv" +`include "hssrdc_driver_cbs_class.sv" + + +`ifndef __HSSDRC_BANDWIDTH_MONITOR_CLASS__ + + `define __HSSDRC_BANDWIDTH_MONITOR_CLASS__ + + class hssdrc_bandwidth_monitor_class extends hssrdc_driver_cbs_class; + + virtual hssdrc_tb_sys_if sys_if; + + // bandwidth measurement FSM + enum {idle, wait_start, work} state = idle; + + // timestamps + realtime end_time; + realtime start_time; + + // word transfer counters + int unsigned wr_word_num; + int unsigned rd_word_num; + + // bandwidth measurement itself + real write_bandwidth ; + real read_bandwidth ; + real bandwidth ; + + real write_bandwidth_percent ; + real read_bandwidth_percent ; + real bandwidth_percent ; + + // semaphore to controll access to variables + semaphore sem; + + // bandwidth measurement parameters + real mbps_mfactor; + real max_bandwidth; + + // tb syncronization + int measured_tr_num = 0; + event done; + + function new (virtual hssdrc_tb_sys_if sys_if, ref event done); + sem = new (1); + + this.sys_if = sys_if; + + this.done = done; + endfunction + + + // + // function to start measurement process + // + + task start(); + + sem.get (1) ; + + // set begin + state = wait_start; + + // clear all counters + end_time = 0ns; + start_time = 0ns; + + wr_word_num = 0; + rd_word_num = 0; + + measured_tr_num = 0; + + sem.put (1) ; + endtask + + // + // function to stop measurement process + // + + task stop(); + sem.get (1); + + state = idle; + count_bandwidth(); + + sem.put (1); + + endtask + + // + // callback for command part of hssdrc_driver_class + // + + task post_Command (input realtime t); + endtask + + // + // callback for write part of hssdrc_driver_class + // + + task post_WriteData (input realtime t, sdram_transaction_class tr); + int burst; + begin + + burst = tr.burst + 1; + + sem.get (1); + + if (state == wait_start) begin + start_time = t; + state = work; + end + else if (state == work) begin + wr_word_num += burst; + end_time = t; + end + + measured_tr_num++; + -> done; + + sem.put (1); + end + endtask + + // + // callback for read part of hssdrc_driver_class + // + + task post_ReadData ( input realtime t, sdram_transaction_class tr); + int burst; + begin + + burst = tr.burst + 1; + + sem.get (1); + + if (state == wait_start) begin + start_time = t; + state = work; + end + else if (state == work) begin + rd_word_num += burst; + end_time = t; + end + + measured_tr_num++; + + -> done; + + sem.put (1); + end + endtask + + // + // measurement count function bwth = mbps_mfactor*num/(end_time - start_time); + // + + function void count_bandwidth(); + realtime delta; + int unsigned wrrd_word_num; + begin + + delta = (end_time - start_time); + + wrrd_word_num = wr_word_num + rd_word_num; + + write_bandwidth = (wr_word_num/delta)*mbps_mfactor; + read_bandwidth = (rd_word_num/delta)*mbps_mfactor; + bandwidth = (wrrd_word_num/delta)*mbps_mfactor; + + write_bandwidth_percent = write_bandwidth*100.0/max_bandwidth ; + read_bandwidth_percent = read_bandwidth *100.0/max_bandwidth ; + bandwidth_percent = bandwidth *100.0/max_bandwidth ; + + end + endfunction + + // + // task to get multiplicatin factor for counters + // + + task count_mbps_mfactor (int bytes_in_kilobytes) ; + realtime delta; + realtime scale; + begin + // define current timeunit value + delta = $realtime; + #1; + delta = $realtime - delta; + + // define time scale factor + scale = 1s/delta; + + // kilobytes + mbps_mfactor = real'(scale)/(bytes_in_kilobytes); + + // megabytes + mbps_mfactor = mbps_mfactor/(bytes_in_kilobytes); + + mbps_mfactor = mbps_mfactor*pDatamBits; + + // define max bandwwidth : 1 world per cycle period + @(sys_if.cb); + delta = $realtime; + @(sys_if.cb); + delta = $realtime - delta; + + max_bandwidth = (1/delta)*mbps_mfactor; + + end + endtask + + endclass + +`endif
hssdrc/trunk/testbench/hssrdc_bandwidth_monitor_class.sv Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/testbench/tb_top.sv =================================================================== --- hssdrc/trunk/testbench/tb_top.sv (nonexistent) +++ hssdrc/trunk/testbench/tb_top.sv (revision 3) @@ -0,0 +1,182 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:54:00 $ +// +// Workfile : tb_top.sv +// +// Description : testbench top level +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + + +`include "hssdrc_timescale.vh" +`include "hssdrc_define.vh" +`include "hssdrc_timing.vh" +`include "hssdrc_tb_sys_if.vh" + +module tb_top; + + parameter cPeriod = 1000.0/pClkMHz; + parameter cHalfPeriod = cPeriod/2.0; + + wire [pDataBits-1:0] dq; + wire [pDatamBits-1:0] dqm; + wire [pSdramAddrBits-1 :0] addr; + wire [pBaBits-1 :0] ba; + wire cke ; + wire cs_n ; + wire ras_n ; + wire cas_n ; + wire we_n ; + + logic sys_write; + logic sys_read ; + logic sys_refr ; + rowa_t sys_rowa ; + cola_t sys_cola ; + ba_t sys_ba ; + burst_t sys_burst ; + chid_t sys_chid_i; + data_t sys_wdata ; + datam_t sys_wdatam; + logic sys_ready ; + logic sys_use_wdata ; + logic sys_vld_rdata ; + chid_t sys_chid_o ; + data_t sys_rdata ; + + + bit clk_main ; + bit clk; + bit nclk; + + bit reset ; + bit sclr ; + + hssdrc_tb_sys_if sys_if (clk, reset, sclr); + + assign sys_write = sys_if.write ; + assign sys_read = sys_if.read ; + assign sys_refr = sys_if.refr ; + assign sys_rowa = sys_if.rowa ; + assign sys_cola = sys_if.cola ; + assign sys_ba = sys_if.ba ; + assign sys_burst = sys_if.burst ; + assign sys_chid_i = sys_if.chid_i; + assign sys_wdata = sys_if.wdata ; + assign sys_wdatam = sys_if.wdatam; + + assign sys_if.ready = sys_ready ; + assign sys_if.use_wdata = sys_use_wdata ; + assign sys_if.vld_rdata = sys_vld_rdata ; + assign sys_if.chid_o = sys_chid_o ; + assign sys_if.rdata = sys_rdata ; + + + mt48lc2m32b2 sdram_chip ( + .Dq (dq ), + .Addr (addr ), + .Ba (ba ), + .Clk (nclk ), + .Cke (cke ), + .Cs_n (cs_n ), + .Ras_n (ras_n), + .Cas_n (cas_n), + .We_n (we_n ), + .Dqm (dqm ) + ); + + sdram_interpretator inter ( + .ba (ba), + .cs_n (cs_n ), + .ras_n(ras_n), + .cas_n(cas_n), + .we_n (we_n ), + .a10 (addr [10] ) + ); + + hssdrc_top top( + .clk (clk ), + .reset (reset), + .sclr (sclr ), + // + .sys_write (sys_write ), + .sys_read (sys_read ), + .sys_refr (sys_refr ), + .sys_rowa (sys_rowa ), + .sys_cola (sys_cola ), + .sys_ba (sys_ba ), + .sys_burst (sys_burst ), + .sys_chid_i (sys_chid_i ), + .sys_wdata (sys_wdata ), + .sys_wdatam (sys_wdatam ), + .sys_ready (sys_ready ), + .sys_use_wdata (sys_use_wdata), + .sys_vld_rdata (sys_vld_rdata), + .sys_chid_o (sys_chid_o ), + .sys_rdata (sys_rdata ), + // + .dq (dq ), + .dqm (dqm ), + .addr (addr ), + .ba (ba ), + .cke (cke ), + .cs_n (cs_n ), + .ras_n (ras_n), + .cas_n (cas_n), + .we_n (we_n ) + ); + + initial begin : clock_generator + clk_main = 1'b0; + #(cHalfPeriod); + forever clk_main = #(cHalfPeriod) ~clk_main; + end + + always_comb begin + clk <= clk_main; + nclk <= #2 ~clk_main; // model output buffer delay + end + + assign sclr = 1'b0; + + initial begin : reset_generator + reset = 1'b1; + + repeat (4) @(posedge clk); + @(negedge clk); + + reset = 1'b0; + end + + tb_prog prog (sys_if.tb); + +endmodule
hssdrc/trunk/testbench/tb_top.sv Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/rtl/hssdrc_data_path.v =================================================================== --- hssdrc/trunk/rtl/hssdrc_data_path.v (nonexistent) +++ hssdrc/trunk/rtl/hssdrc_data_path.v (revision 3) @@ -0,0 +1,405 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:52:43 $ +// +// Workfile : hssdrc_data_path.v +// +// Description : sdram data (data & mask) path unit +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +`include "hssdrc_timescale.vh" + +`include "hssdrc_timing.vh" +`include "hssdrc_define.vh" + +module hssdrc_data_path ( + clk , + reset , + sclr , + // + sys_wdata , + sys_wdatam , + sys_use_wdata , + sys_vld_rdata , + sys_chid_o , + sys_rdata , + // + arb_read , + arb_write , + arb_chid , + arb_burst , + // + dq , + dqm + ); + + input wire clk; + input wire reset; + input wire sclr; + + //-------------------------------------------------------------------------------------------------- + // system data interface + //-------------------------------------------------------------------------------------------------- + + input data_t sys_wdata ; + input datam_t sys_wdatam ; + output logic sys_use_wdata ; + output logic sys_vld_rdata ; + output chid_t sys_chid_o ; + output data_t sys_rdata ; + + //-------------------------------------------------------------------------------------------------- + // interface from arbiter throw multiplexer + //-------------------------------------------------------------------------------------------------- + + input wire arb_read ; + input wire arb_write ; + input chid_t arb_chid ; + input sdram_burst_t arb_burst ; + + //-------------------------------------------------------------------------------------------------- + // interface sdram chip + //-------------------------------------------------------------------------------------------------- + + inout wire [pDataBits-1 :0] dq; + output logic [pDatamBits-1 :0] dqm; + + //-------------------------------------------------------------------------------------------------- + // Mask paramters count via pBL, pCL parameters only for clarify. + // unit has been designed to use fixed lengh mask patterns + //-------------------------------------------------------------------------------------------------- + localparam cWDataMask = cSdramBL - 1; // - 1 cycle for write command itself + + localparam cRDataMask = cSdramBL - 1 + pCL - 2; // - 1 cycle for read command itself, + // - 2 cycle for read dqm latency + + localparam cDataMask = max(cWDataMask, cRDataMask); + + localparam cReadAllign = pCL + 1; // + 1 is capture register cycle + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + logic [3:0] use_wdata_srl; + wire use_wdata; + wire use_wdatam; + + logic [cDataMask-1 : 0] datam_srl; + logic datam; + + + + logic [3:0] vld_rdata_srl; + logic vld_rdata; + logic vld_rdata_allign_srl [cReadAllign-1 : 0]; + + chid_t chid_srl [3:0]; + chid_t chid; + chid_t chid_allign_srl [cReadAllign-1 : 0]; + + //-------------------------------------------------------------------------------------------------- + // use write data & mask + //-------------------------------------------------------------------------------------------------- + + always_ff @(posedge clk or posedge reset) begin : use_wdata_generate + if (reset) + use_wdata_srl <= 4'b0000; + else if (sclr) + use_wdata_srl <= 4'b0000; + else if (arb_write) + unique case (arb_burst) + 2'h0 : use_wdata_srl <= 4'b1000; + 2'h1 : use_wdata_srl <= 4'b1100; + 2'h2 : use_wdata_srl <= 4'b1110; + 2'h3 : use_wdata_srl <= 4'b1111; + endcase + else + use_wdata_srl <= (use_wdata_srl << 1); + end + + assign use_wdata = use_wdata_srl[3]; + assign use_wdatam = use_wdata_srl[3]; + + //-------------------------------------------------------------------------------------------------- + // read/write data mask for command terminate + //-------------------------------------------------------------------------------------------------- + + always_ff @(posedge clk or posedge reset) begin : data_burst_mask_generate + if (reset) + datam_srl <= '0; + else if (sclr) + datam_srl <= '0; + else begin + if (arb_write) + datam_srl <= WriteMaskBits(arb_burst); + else if (arb_read) + datam_srl <= ReadMaskBits(arb_burst); + else + datam_srl <= (datam_srl << 1); + end + end + + always_ff @(posedge clk or posedge reset) begin : data_mask_generate + if (reset) + datam <= 1'b0; + else if (sclr) + datam <= 1'b0; + else begin + if (arb_write) + datam <= 1'b0; + else if (arb_read) + datam <= FirstReadMaskBit(arb_burst); + else + datam <= datam_srl [cDataMask-1]; + end + end + + // + // dqm + // + + assign dqm = use_wdatam ? sys_wdatam : {pDatamBits{datam}}; + + //-------------------------------------------------------------------------------------------------- + // write data request + //-------------------------------------------------------------------------------------------------- + +`ifndef HSSDRC_COMBINATORY_USE_WDATA + + assign sys_use_wdata = use_wdata; + +`else + + logic [2:0] use_wdata_srl_small; + + always_ff @(posedge clk or posedge reset) begin : use_wdata_small_generate + if (reset) + use_wdata_srl_small <= 3'b000; + else if (sclr) + use_wdata_srl_small <= 3'b000; + else if (arb_write) + unique case (arb_burst) + 2'h0 : use_wdata_srl_small <= 3'b000; + 2'h1 : use_wdata_srl_small <= 3'b100; + 2'h2 : use_wdata_srl_small <= 3'b110; + 2'h3 : use_wdata_srl_small <= 3'b111; + endcase + else + use_wdata_srl_small <= (use_wdata_srl_small << 1); + end + + assign sys_use_wdata = arb_write | use_wdata_srl_small[2]; + +`endif + // + // dq + // + + assign dq = use_wdata ? sys_wdata : {pDataBits{1'bz}}; + + //-------------------------------------------------------------------------------------------------- + // read data + //-------------------------------------------------------------------------------------------------- + + always_ff @(posedge clk or posedge reset) begin : vld_rdata_generate + if (reset) + vld_rdata_srl <= 4'b0000; + else if (sclr) + vld_rdata_srl <= 4'b0000; + else if (arb_read) + unique case (arb_burst) + 2'h0 : vld_rdata_srl <= 4'b1000; + 2'h1 : vld_rdata_srl <= 4'b1100; + 2'h2 : vld_rdata_srl <= 4'b1110; + 2'h3 : vld_rdata_srl <= 4'b1111; + endcase + else + vld_rdata_srl <= (vld_rdata_srl << 1); + end + + assign vld_rdata = vld_rdata_srl [3]; + + // + // + // + + always_ff @(posedge clk) begin : chid_rdata_generate + int i; + + if (arb_read) begin + for (i = 0; i < 4; i++) + chid_srl[i] <= arb_chid; // load all with chid + end + else begin + for (i = 1; i < 4; i++) + chid_srl[i] <= chid_srl[i-1]; // shift left + end + end + + assign chid = chid_srl [3]; + + // + // + // + + always_ff @(posedge clk or posedge reset) begin : vld_rdata_allign_generate + int i; + + if (reset) begin + for (i = 0; i < cReadAllign; i++) + vld_rdata_allign_srl[i] <= 1'b0; + end + else if (sclr) begin + for (i = 0; i < cReadAllign; i++) + vld_rdata_allign_srl[i] <= 1'b0; + end + else begin + vld_rdata_allign_srl[0] <= vld_rdata; // shift left + + for (i = 1; i < cReadAllign; i++) + vld_rdata_allign_srl[i] <= vld_rdata_allign_srl [i-1]; + end + end + + + assign sys_vld_rdata = vld_rdata_allign_srl [cReadAllign-1]; + + // + // + // + + always_ff @(posedge clk) begin : chid_allign_generate + int i; + + chid_allign_srl[0] <= chid; // shift left + + for (i = 1; i < cReadAllign; i++) + chid_allign_srl[i] <= chid_allign_srl[i-1]; + end + + + assign sys_chid_o = chid_allign_srl [cReadAllign-1]; + + // + // + // + + always_ff @(posedge clk) begin : rdata_reclock + sys_rdata <= dq; + end + + //-------------------------------------------------------------------------------------------------- + // function to count write bit mask pattern for different burst value and + // for different Cas Latency paramter value + // full burst == 2'h3 no need to be masked + //-------------------------------------------------------------------------------------------------- + + function automatic bit [cDataMask-1:0] WriteMaskBits (input bit [1:0] burst); + if (pCL == 3) begin + WriteMaskBits = 4'b0000; + case (burst) + 2'h0 : WriteMaskBits = 4'b1110; + 2'h1 : WriteMaskBits = 4'b0110; + 2'h2 : WriteMaskBits = 4'b0010; + endcase + end + else if (pCL == 2) begin + WriteMaskBits = 3'b000; + case (burst) + 2'h0 : WriteMaskBits = 3'b111; + 2'h1 : WriteMaskBits = 3'b011; + 2'h2 : WriteMaskBits = 3'b001; + endcase + end + else if (pCL == 1) begin + WriteMaskBits = 3'b000; + case (burst) + 2'h0 : WriteMaskBits = 3'b111; + 2'h1 : WriteMaskBits = 3'b011; + 2'h2 : WriteMaskBits = 3'b001; + endcase + end + else begin + WriteMaskBits = '0; + end + endfunction + + //-------------------------------------------------------------------------------------------------- + // function to count first read bit mask pattern for different burst value and + // for different Cas Latency paramter value + //-------------------------------------------------------------------------------------------------- + + function automatic bit FirstReadMaskBit (input bit [1:0] burst); + if ((pCL == 1) && (burst == 0)) + FirstReadMaskBit = 1'b1; + else + FirstReadMaskBit = 1'b0; + endfunction + + //-------------------------------------------------------------------------------------------------- + // function to count read bit mask pattern for different burst value and + // for different Cas Latency paramter value + // full burst == 2'h3 no need to be masked + //-------------------------------------------------------------------------------------------------- + + function automatic bit [cDataMask-1:0] ReadMaskBits (input bit [1:0] burst); + if (pCL == 3) begin + ReadMaskBits = 4'b0000; + case (burst) + 2'h0 : ReadMaskBits = 4'b0111; + 2'h1 : ReadMaskBits = 4'b0011; + 2'h2 : ReadMaskBits = 4'b0001; + endcase + end + else if (pCL == 2) begin + ReadMaskBits = 3'b000; + case (burst) + 2'h0 : ReadMaskBits = 3'b111; + 2'h1 : ReadMaskBits = 3'b011; + 2'h2 : ReadMaskBits = 3'b001; + endcase + end + else if (pCL == 1) begin + ReadMaskBits = 3'b000; + case (burst) + 2'h0 : ReadMaskBits = 3'b110; + 2'h1 : ReadMaskBits = 3'b110; + 2'h2 : ReadMaskBits = 3'b010; + endcase + end + else begin + ReadMaskBits = '0; + end + endfunction + +endmodule
hssdrc/trunk/rtl/hssdrc_data_path.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/rtl/hssdrc_data_path_p1.v =================================================================== --- hssdrc/trunk/rtl/hssdrc_data_path_p1.v (nonexistent) +++ hssdrc/trunk/rtl/hssdrc_data_path_p1.v (revision 3) @@ -0,0 +1,429 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:52:43 $ +// +// Workfile : hssdrc_data_path_p1.v +// +// Description : sdram data (data & mask) path unit +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +`include "hssdrc_timescale.vh" + +`include "hssdrc_timing.vh" +`include "hssdrc_define.vh" + +module hssdrc_data_path_p1 ( + clk , + reset , + sclr , + // + sys_wdata , + sys_wdatam , + sys_use_wdata , + sys_vld_rdata , + sys_chid_o , + sys_rdata , + // + arb_read , + arb_write , + arb_chid , + arb_burst , + // + dq , + dqm + ); + + input wire clk; + input wire reset; + input wire sclr; + + //-------------------------------------------------------------------------------------------------- + // system data interface + //-------------------------------------------------------------------------------------------------- + + input data_t sys_wdata ; + input datam_t sys_wdatam ; + output logic sys_use_wdata ; + output logic sys_vld_rdata ; + output chid_t sys_chid_o ; + output data_t sys_rdata ; + + //-------------------------------------------------------------------------------------------------- + // interface from arbiter throw multiplexer + //-------------------------------------------------------------------------------------------------- + + input wire arb_read ; + input wire arb_write ; + input chid_t arb_chid ; + input sdram_burst_t arb_burst ; + + //-------------------------------------------------------------------------------------------------- + // interface sdram chip + //-------------------------------------------------------------------------------------------------- + + inout wire [pDataBits-1 :0] dq; + output logic [pDatamBits-1 :0] dqm; + + //-------------------------------------------------------------------------------------------------- + // Mask paramters count via pBL, pCL parameters only for clarify. + // unit has been designed to use fixed lengh mask patterns + //-------------------------------------------------------------------------------------------------- + localparam cWDataMask = cSdramBL - 1; // - 1 cycle for write command itself + + localparam cRDataMask = cSdramBL - 1 + pCL - 2; // - 1 cycle for read command itself, + // - 2 cycle for read dqm latency + + localparam cDataMask = max(cWDataMask, cRDataMask); + + localparam cReadAllign = pCL + 1 + 1; // + 1 is capture register cycle + // + 1 is additition command latency + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + data_t wdata_delayed; + logic use_wdata_delayed; + + logic [3:0] use_wdata_srl; + wire use_wdata; + wire use_wdatam; + + logic [cDataMask-1 : 0] datam_srl; + logic datam; + + + logic [3:0] vld_rdata_srl; + logic vld_rdata; + logic vld_rdata_allign_srl [cReadAllign-1 : 0]; + + chid_t chid_srl [3:0]; + chid_t chid; + chid_t chid_allign_srl [cReadAllign-1 : 0]; + + //-------------------------------------------------------------------------------------------------- + // use write data & mask + //-------------------------------------------------------------------------------------------------- + + always_ff @(posedge clk or posedge reset) begin : use_wdata_generate + if (reset) + use_wdata_srl <= 4'b0000; + else if (sclr) + use_wdata_srl <= 4'b0000; + else if (arb_write) + unique case (arb_burst) + 2'h0 : use_wdata_srl <= 4'b1000; + 2'h1 : use_wdata_srl <= 4'b1100; + 2'h2 : use_wdata_srl <= 4'b1110; + 2'h3 : use_wdata_srl <= 4'b1111; + endcase + else + use_wdata_srl <= (use_wdata_srl << 1); + end + + assign use_wdata = use_wdata_srl[3]; + assign use_wdatam = use_wdata_srl[3]; + + // + // read/write data mask for command terminate + // + + always_ff @(posedge clk or posedge reset) begin : data_burst_mask_generate + if (reset) + datam_srl <= '0; + else if (sclr) + datam_srl <= '0; + else begin + if (arb_write) + datam_srl <= WriteMaskBits(arb_burst); + else if (arb_read) + datam_srl <= ReadMaskBits(arb_burst); + else + datam_srl <= (datam_srl << 1); + end + end + + always_ff @(posedge clk or posedge reset) begin : data_mask_generate + if (reset) + datam <= 1'b0; + else if (sclr) + datam <= 1'b0; + else begin + if (arb_write) + datam <= 1'b0; + else if (arb_read) + datam <= FirstReadMaskBit(arb_burst); + else + datam <= datam_srl [cDataMask-1]; + end + end + + // + // dqm + // + + + always_ff @(posedge clk or posedge reset) begin + if (reset) + dqm <= '0; + else if (sclr) + dqm <= '0; + else + dqm <= use_wdatam ? sys_wdatam : {pDatamBits{datam}}; + end + + + //-------------------------------------------------------------------------------------------------- + // write data request + //-------------------------------------------------------------------------------------------------- + +`ifndef HSSDRC_COMBINATORY_USE_WDATA + + assign sys_use_wdata = use_wdata; + +`else + + logic [2:0] use_wdata_srl_small; + + always_ff @(posedge clk or posedge reset) begin : use_wdata_small_generate + if (reset) + use_wdata_srl_small <= 3'b000; + else if (sclr) + use_wdata_srl_small <= 3'b000; + else if (arb_write) + unique case (arb_burst) + 2'h0 : use_wdata_srl_small <= 3'b000; + 2'h1 : use_wdata_srl_small <= 3'b100; + 2'h2 : use_wdata_srl_small <= 3'b110; + 2'h3 : use_wdata_srl_small <= 3'b111; + endcase + else + use_wdata_srl_small <= (use_wdata_srl_small << 1); + end + + assign sys_use_wdata = arb_write | use_wdata_srl_small[2]; + +`endif + // + // dq + // + + + always_ff @(posedge clk) begin : wdata_reclock + wdata_delayed <= sys_wdata; + end + + always_ff @(posedge clk or posedge reset) begin : use_wdata_reclock + if (reset) + use_wdata_delayed <= 1'b0; + else + use_wdata_delayed <= use_wdata; + end + + + assign dq = use_wdata_delayed ? wdata_delayed : {pDataBits{1'bz}}; + + //-------------------------------------------------------------------------------------------------- + // read data + //-------------------------------------------------------------------------------------------------- + + always_ff @(posedge clk or posedge reset) begin : vld_rdata_generate + if (reset) + vld_rdata_srl <= 4'b0000; + else if (sclr) + vld_rdata_srl <= 4'b0000; + else if (arb_read) + unique case (arb_burst) + 2'h0 : vld_rdata_srl <= 4'b1000; + 2'h1 : vld_rdata_srl <= 4'b1100; + 2'h2 : vld_rdata_srl <= 4'b1110; + 2'h3 : vld_rdata_srl <= 4'b1111; + endcase + else + vld_rdata_srl <= (vld_rdata_srl << 1); + end + + assign vld_rdata = vld_rdata_srl [3]; + + // + // + // + + always_ff @(posedge clk) begin : chid_rdata_generate + int i; + + if (arb_read) begin + for (i = 0; i < 4; i++) + chid_srl[i] <= arb_chid; // load all with chid + end + else begin + for (i = 1; i < 4; i++) + chid_srl[i] <= chid_srl[i-1]; // shift left with last data stable + end + end + + assign chid = chid_srl [3]; + + // + // + // + + always_ff @(posedge clk or posedge reset) begin : vld_rdata_allign_generate + int i; + + if (reset) begin + for (i = 0; i < cReadAllign; i++) + vld_rdata_allign_srl[i] <= 1'b0; + end + else if (sclr) begin + for (i = 0; i < cReadAllign; i++) + vld_rdata_allign_srl[i] <= 1'b0; + end + else begin + vld_rdata_allign_srl[0] <= vld_rdata; // shift left + + for (i = 1; i < cReadAllign; i++) + vld_rdata_allign_srl[i] <= vld_rdata_allign_srl [i-1]; + end + end + + + assign sys_vld_rdata = vld_rdata_allign_srl [cReadAllign-1]; + + // + // + // + + always_ff @(posedge clk) begin : chid_allign_generate + int i; + + chid_allign_srl[0] <= chid; // shift left + + for (i = 1; i < cReadAllign; i++) + chid_allign_srl[i] <= chid_allign_srl[i-1]; + end + + + assign sys_chid_o = chid_allign_srl [cReadAllign-1]; + + // + // + // + + always_ff @(posedge clk) begin : rdata_reclock + sys_rdata <= dq; + end + + //-------------------------------------------------------------------------------------------------- + // function to count write bit mask pattern for different burst value and + // for different Cas Latency paramter value + // full burst == 2'h3 no need to be masked + //-------------------------------------------------------------------------------------------------- + + function automatic bit [cDataMask-1:0] WriteMaskBits (input bit [1:0] burst); + if (pCL == 3) begin + WriteMaskBits = 4'b0000; + case (burst) + 2'h0 : WriteMaskBits = 4'b1110; + 2'h1 : WriteMaskBits = 4'b0110; + 2'h2 : WriteMaskBits = 4'b0010; + endcase + end + else if (pCL == 2) begin + WriteMaskBits = 3'b000; + case (burst) + 2'h0 : WriteMaskBits = 3'b111; + 2'h1 : WriteMaskBits = 3'b011; + 2'h2 : WriteMaskBits = 3'b001; + endcase + end + else if (pCL == 1) begin + WriteMaskBits = 3'b000; + case (burst) + 2'h0 : WriteMaskBits = 3'b111; + 2'h1 : WriteMaskBits = 3'b011; + 2'h2 : WriteMaskBits = 3'b001; + endcase + end + else begin + WriteMaskBits = '0; + end + endfunction + + //-------------------------------------------------------------------------------------------------- + // function to count first read bit mask pattern for different burst value and + // for different Cas Latency paramter value + //-------------------------------------------------------------------------------------------------- + + function automatic bit FirstReadMaskBit (input bit [1:0] burst); + if ((pCL == 1) && (burst == 0)) + FirstReadMaskBit = 1'b1; + else + FirstReadMaskBit = 1'b0; + endfunction + + //-------------------------------------------------------------------------------------------------- + // function to count read bit mask pattern for different burst value and + // for different Cas Latency paramter value + // full burst == 2'h3 no need to be masked + //-------------------------------------------------------------------------------------------------- + + function automatic bit [cDataMask-1:0] ReadMaskBits (input bit [1:0] burst); + if (pCL == 3) begin + ReadMaskBits = 4'b0000; + case (burst) + 2'h0 : ReadMaskBits = 4'b0111; + 2'h1 : ReadMaskBits = 4'b0011; + 2'h2 : ReadMaskBits = 4'b0001; + endcase + end + else if (pCL == 2) begin + ReadMaskBits = 3'b000; + case (burst) + 2'h0 : ReadMaskBits = 3'b111; + 2'h1 : ReadMaskBits = 3'b011; + 2'h2 : ReadMaskBits = 3'b001; + endcase + end + else if (pCL == 1) begin + ReadMaskBits = 3'b000; + case (burst) + 2'h0 : ReadMaskBits = 3'b110; + 2'h1 : ReadMaskBits = 3'b110; + 2'h2 : ReadMaskBits = 3'b010; + endcase + end + else begin + ReadMaskBits = '0; + end + endfunction + +endmodule
hssdrc/trunk/rtl/hssdrc_data_path_p1.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/rtl/hssdrc_decoder.v =================================================================== --- hssdrc/trunk/rtl/hssdrc_decoder.v (nonexistent) +++ hssdrc/trunk/rtl/hssdrc_decoder.v (revision 3) @@ -0,0 +1,477 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:52:43 $ +// +// Workfile : hssdrc_decoder.v +// +// Description : sdram command sequence decoder's array +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +`include "hssdrc_timescale.vh" + +`include "hssdrc_define.vh" + +module hssdrc_decoder ( + clk , + reset , + sclr , + // + ba_map_update , + ba_map_clear , + ba_map_ba , + ba_map_rowa , + ba_map_pre_act_rw , + ba_map_act_rw , + ba_map_rw , + ba_map_all_close , + // + arb0_write , + arb0_read , + arb0_refr , + arb0_rowa , + arb0_cola , + arb0_ba , + arb0_burst , + arb0_chid , + arb0_ready , + // + arb1_write , + arb1_read , + arb1_refr , + arb1_rowa , + arb1_cola , + arb1_ba , + arb1_burst , + arb1_chid , + arb1_ready , + // + arb2_write , + arb2_read , + arb2_refr , + arb2_rowa , + arb2_cola , + arb2_ba , + arb2_burst , + arb2_chid , + arb2_ready , + // + dec0_pre_all , + dec0_refr , + dec0_pre , + dec0_act , + dec0_read , + dec0_write , + dec0_pre_all_enable , + dec0_refr_enable , + dec0_pre_enable , + dec0_act_enable , + dec0_read_enable , + dec0_write_enable , + dec0_locked , + dec0_last , + dec0_rowa , + dec0_cola , + dec0_ba , + dec0_chid , + dec0_burst , + // + dec1_pre_all , + dec1_refr , + dec1_pre , + dec1_act , + dec1_read , + dec1_write , + dec1_pre_all_enable , + dec1_refr_enable , + dec1_pre_enable , + dec1_act_enable , + dec1_read_enable , + dec1_write_enable , + dec1_locked , + dec1_last , + dec1_rowa , + dec1_cola , + dec1_ba , + dec1_chid , + dec1_burst , + // + dec2_pre_all , + dec2_refr , + dec2_pre , + dec2_act , + dec2_read , + dec2_write , + dec2_pre_all_enable , + dec2_refr_enable , + dec2_pre_enable , + dec2_act_enable , + dec2_read_enable , + dec2_write_enable , + dec2_locked , + dec2_last , + dec2_rowa , + dec2_cola , + dec2_ba , + dec2_chid , + dec2_burst + ); + + input wire clk ; + input wire reset; + input wire sclr ; + + //-------------------------------------------------------------------------------------------------- + // bank map interface + //-------------------------------------------------------------------------------------------------- + + output wire ba_map_update ; + output wire ba_map_clear ; + output ba_t ba_map_ba ; + output rowa_t ba_map_rowa ; + input wire ba_map_pre_act_rw; + input wire ba_map_act_rw ; + input wire ba_map_rw ; + input wire ba_map_all_close ; + + //-------------------------------------------------------------------------------------------------- + // interface from input arbiter + //-------------------------------------------------------------------------------------------------- + + input logic arb0_write ; + input logic arb0_read ; + input logic arb0_refr ; + input rowa_t arb0_rowa ; + input cola_t arb0_cola ; + input ba_t arb0_ba ; + input burst_t arb0_burst ; + input chid_t arb0_chid ; + output wire arb0_ready ; + // + input logic arb1_write ; + input logic arb1_read ; + input logic arb1_refr ; + input rowa_t arb1_rowa ; + input cola_t arb1_cola ; + input ba_t arb1_ba ; + input burst_t arb1_burst ; + input chid_t arb1_chid ; + output wire arb1_ready ; + // + input logic arb2_write ; + input logic arb2_read ; + input logic arb2_refr ; + input rowa_t arb2_rowa ; + input cola_t arb2_cola ; + input ba_t arb2_ba ; + input burst_t arb2_burst ; + input chid_t arb2_chid ; + output wire arb2_ready ; + + //-------------------------------------------------------------------------------------------------- + // inteface to output arbiter + //-------------------------------------------------------------------------------------------------- + + output logic dec0_pre_all ; + output logic dec0_refr ; + output logic dec0_pre ; + output logic dec0_act ; + output logic dec0_read ; + output logic dec0_write ; + input wire dec0_pre_all_enable; + input wire dec0_refr_enable ; + input wire dec0_pre_enable ; + input wire dec0_act_enable ; + input wire dec0_read_enable ; + input wire dec0_write_enable ; + output logic dec0_locked ; + output logic dec0_last ; + output rowa_t dec0_rowa ; + output cola_t dec0_cola ; + output ba_t dec0_ba ; + output chid_t dec0_chid ; + output sdram_burst_t dec0_burst ; + // + output logic dec1_pre_all ; + output logic dec1_refr ; + output logic dec1_pre ; + output logic dec1_act ; + output logic dec1_read ; + output logic dec1_write ; + input wire dec1_pre_all_enable; + input wire dec1_refr_enable ; + input wire dec1_pre_enable ; + input wire dec1_act_enable ; + input wire dec1_read_enable ; + input wire dec1_write_enable ; + output logic dec1_locked ; + output logic dec1_last ; + output rowa_t dec1_rowa ; + output cola_t dec1_cola ; + output ba_t dec1_ba ; + output chid_t dec1_chid ; + output sdram_burst_t dec1_burst ; + // + output logic dec2_pre_all ; + output logic dec2_refr ; + output logic dec2_pre ; + output logic dec2_act ; + output logic dec2_read ; + output logic dec2_write ; + input wire dec2_pre_all_enable; + input wire dec2_refr_enable ; + input wire dec2_pre_enable ; + input wire dec2_act_enable ; + input wire dec2_read_enable ; + input wire dec2_write_enable ; + output logic dec2_locked ; + output logic dec2_last ; + output rowa_t dec2_rowa ; + output cola_t dec2_cola ; + output ba_t dec2_ba ; + output chid_t dec2_chid ; + output sdram_burst_t dec2_burst ; + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + ba_t ba_latched ; + rowa_t rowa_latched; + + // + // local state ba_map signals + // + + wire state0__ba_map_update ; + wire state0__ba_map_clear ; + wire state0__ba_map_pre_act_rw ; + wire state0__ba_map_act_rw ; + wire state0__ba_map_rw ; + wire state0__ba_map_all_close ; + + wire state1__ba_map_update ; + wire state1__ba_map_clear ; + wire state1__ba_map_pre_act_rw ; + wire state1__ba_map_act_rw ; + wire state1__ba_map_rw ; + wire state1__ba_map_all_close ; + + wire state2__ba_map_update ; + wire state2__ba_map_clear ; + wire state2__ba_map_pre_act_rw ; + wire state2__ba_map_act_rw ; + wire state2__ba_map_rw ; + wire state2__ba_map_all_close ; + + //-------------------------------------------------------------------------------------------------- + // we can capture bank map data into register, becouse we have +1 tick in FSM + // for bank map decoding we can take data from any arbiter channel + //-------------------------------------------------------------------------------------------------- + + always_ff @(posedge clk) begin : ba_map_data_register + ba_latched <= arb0_ba; + rowa_latched <= arb0_rowa; + end + + // + // + // + + assign ba_map_ba = ba_latched; + assign ba_map_rowa = rowa_latched; + assign ba_map_update = state0__ba_map_update | state1__ba_map_update | state2__ba_map_update ; + assign ba_map_clear = state0__ba_map_clear | state1__ba_map_clear | state2__ba_map_clear ; + + assign state0__ba_map_pre_act_rw = ba_map_pre_act_rw ; + assign state0__ba_map_act_rw = ba_map_act_rw ; + assign state0__ba_map_rw = ba_map_rw ; + assign state0__ba_map_all_close = ba_map_all_close ; + + assign state1__ba_map_pre_act_rw = ba_map_pre_act_rw ; + assign state1__ba_map_act_rw = ba_map_act_rw ; + assign state1__ba_map_rw = ba_map_rw ; + assign state1__ba_map_all_close = ba_map_all_close ; + + assign state2__ba_map_pre_act_rw = ba_map_pre_act_rw ; + assign state2__ba_map_act_rw = ba_map_act_rw ; + assign state2__ba_map_rw = ba_map_rw ; + assign state2__ba_map_all_close = ba_map_all_close ; + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + hssdrc_decoder_state state0 ( + .clk (clk ), + .reset (reset), + .sclr (sclr ), + // + .ba_map_update (state0__ba_map_update ), + .ba_map_clear (state0__ba_map_clear ), + .ba_map_pre_act_rw (state0__ba_map_pre_act_rw), + .ba_map_act_rw (state0__ba_map_act_rw ), + .ba_map_rw (state0__ba_map_rw ), + .ba_map_all_close (state0__ba_map_all_close ), + // + .arb_write (arb0_write), + .arb_read (arb0_read ), + .arb_refr (arb0_refr ), + .arb_rowa (arb0_rowa ), + .arb_cola (arb0_cola ), + .arb_ba (arb0_ba ), + .arb_burst (arb0_burst), + .arb_chid (arb0_chid ), + .arb_ready (arb0_ready), + // + .dec_pre_all (dec0_pre_all), + .dec_refr (dec0_refr ), + .dec_pre (dec0_pre ), + .dec_act (dec0_act ), + .dec_read (dec0_read ), + .dec_write (dec0_write ), + // + .dec_pre_all_enable(dec0_pre_all_enable), + .dec_refr_enable (dec0_refr_enable ), + .dec_pre_enable (dec0_pre_enable ), + .dec_act_enable (dec0_act_enable ), + .dec_read_enable (dec0_read_enable ), + .dec_write_enable (dec0_write_enable ), + // + .dec_locked (dec0_locked), + .dec_last (dec0_last ), + // + .dec_rowa (dec0_rowa ), + .dec_cola (dec0_cola ), + .dec_ba (dec0_ba ), + .dec_chid (dec0_chid ), + // + .dec_burst (dec0_burst) + ); + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + hssdrc_decoder_state state1 ( + .clk (clk ), + .reset (reset), + .sclr (sclr ), + // + .ba_map_update (state1__ba_map_update ), + .ba_map_clear (state1__ba_map_clear ), + .ba_map_pre_act_rw (state1__ba_map_pre_act_rw), + .ba_map_act_rw (state1__ba_map_act_rw ), + .ba_map_rw (state1__ba_map_rw ), + .ba_map_all_close (state1__ba_map_all_close ), + // + .arb_write (arb1_write), + .arb_read (arb1_read ), + .arb_refr (arb1_refr ), + .arb_rowa (arb1_rowa ), + .arb_cola (arb1_cola ), + .arb_ba (arb1_ba ), + .arb_burst (arb1_burst), + .arb_chid (arb1_chid ), + .arb_ready (arb1_ready), + // + .dec_pre_all (dec1_pre_all), + .dec_refr (dec1_refr ), + .dec_pre (dec1_pre ), + .dec_act (dec1_act ), + .dec_read (dec1_read ), + .dec_write (dec1_write ), + // + .dec_pre_all_enable(dec1_pre_all_enable), + .dec_refr_enable (dec1_refr_enable ), + .dec_pre_enable (dec1_pre_enable ), + .dec_act_enable (dec1_act_enable ), + .dec_read_enable (dec1_read_enable ), + .dec_write_enable (dec1_write_enable ), + // + .dec_locked (dec1_locked), + .dec_last (dec1_last ), + // + .dec_rowa (dec1_rowa ), + .dec_cola (dec1_cola ), + .dec_ba (dec1_ba ), + .dec_chid (dec1_chid ), + // + .dec_burst (dec1_burst) + ); + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + hssdrc_decoder_state state2 ( + .clk (clk ), + .reset (reset), + .sclr (sclr ), + // + .ba_map_update (state2__ba_map_update ), + .ba_map_clear (state2__ba_map_clear ), + .ba_map_pre_act_rw (state2__ba_map_pre_act_rw), + .ba_map_act_rw (state2__ba_map_act_rw ), + .ba_map_rw (state2__ba_map_rw ), + .ba_map_all_close (state2__ba_map_all_close ), + // + .arb_write (arb2_write), + .arb_read (arb2_read ), + .arb_refr (arb2_refr ), + .arb_rowa (arb2_rowa ), + .arb_cola (arb2_cola ), + .arb_ba (arb2_ba ), + .arb_burst (arb2_burst), + .arb_chid (arb2_chid ), + .arb_ready (arb2_ready), + // + .dec_pre_all (dec2_pre_all), + .dec_refr (dec2_refr ), + .dec_pre (dec2_pre ), + .dec_act (dec2_act ), + .dec_read (dec2_read ), + .dec_write (dec2_write ), + // + .dec_pre_all_enable(dec2_pre_all_enable), + .dec_refr_enable (dec2_refr_enable ), + .dec_pre_enable (dec2_pre_enable ), + .dec_act_enable (dec2_act_enable ), + .dec_read_enable (dec2_read_enable ), + .dec_write_enable (dec2_write_enable ), + // + .dec_locked (dec2_locked), + .dec_last (dec2_last ), + // + .dec_rowa (dec2_rowa ), + .dec_cola (dec2_cola ), + .dec_ba (dec2_ba ), + .dec_chid (dec2_chid ), + // + .dec_burst (dec2_burst) + ); + +endmodule
hssdrc/trunk/rtl/hssdrc_decoder.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/rtl/hssdrc_decoder_state.v =================================================================== --- hssdrc/trunk/rtl/hssdrc_decoder_state.v (nonexistent) +++ hssdrc/trunk/rtl/hssdrc_decoder_state.v (revision 3) @@ -0,0 +1,534 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:52:43 $ +// +// Workfile : hssdrc_decoder_state.v +// +// Description : sdram command sequence decoder +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +`include "hssdrc_timescale.vh" + +`include "hssdrc_timing.vh" +`include "hssdrc_define.vh" + + +module hssdrc_decoder_state ( + clk , + reset , + sclr , + // + ba_map_update , + ba_map_clear , + ba_map_pre_act_rw , + ba_map_act_rw , + ba_map_rw , + ba_map_all_close , + // + arb_write , + arb_read , + arb_refr , + arb_rowa , + arb_cola , + arb_ba , + arb_burst , + arb_chid , + arb_ready , + // + dec_pre_all , + dec_refr , + dec_pre , + dec_act , + dec_read , + dec_write , + // + dec_pre_all_enable, + dec_refr_enable , + dec_pre_enable , + dec_act_enable , + dec_read_enable , + dec_write_enable , + // + dec_locked , + dec_last , + // + dec_rowa , + dec_cola , + dec_ba , + dec_chid , + // + dec_burst + ); + + input wire clk ; + input wire reset; + input wire sclr ; + + //-------------------------------------------------------------------------------------------------- + // bank map interface + //-------------------------------------------------------------------------------------------------- + + output logic ba_map_update ; + output logic ba_map_clear ; + input wire ba_map_pre_act_rw ; + input wire ba_map_act_rw ; + input wire ba_map_rw ; + input wire ba_map_all_close ; + + //-------------------------------------------------------------------------------------------------- + // interface from input arbiter + //-------------------------------------------------------------------------------------------------- + + input wire arb_write ; + input wire arb_read ; + input wire arb_refr ; + input rowa_t arb_rowa ; + input cola_t arb_cola ; + input ba_t arb_ba ; + input burst_t arb_burst ; + input chid_t arb_chid ; + output logic arb_ready ; + + //-------------------------------------------------------------------------------------------------- + // inteface to output arbiter + //-------------------------------------------------------------------------------------------------- + + // logical commands + output logic dec_pre_all ; + output logic dec_refr ; + output logic dec_pre ; + output logic dec_act ; + output logic dec_read ; + output logic dec_write ; + // logical commands en + input wire dec_pre_all_enable ; + input wire dec_refr_enable ; + input wire dec_pre_enable ; + input wire dec_act_enable ; + input wire dec_read_enable ; + input wire dec_write_enable ; + // addititional signal + output logic dec_locked ; + output logic dec_last ; + // control path + output rowa_t dec_rowa ; + output cola_t dec_cola ; + output ba_t dec_ba ; + output chid_t dec_chid ; + // + output sdram_burst_t dec_burst ; + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + localparam int cTrp_m1 = cTrp - 1; + localparam int cTrcd_m1 = cTrcd - 1; + + typedef enum { + STATE_RESET_BIT , // need for create simple true ready condition + STATE_IDLE_BIT , + STATE_DECODE_BIT , + STATE_PRE_BIT , + STATE_TRP_BIT , + STATE_ACT_BIT , + STATE_TRCD_BIT , + STATE_RW_BIT , + STATE_ADDR_INC_BIT, + STATE_PRE_ALL_BIT , + STATE_REFR_BIT + } state_bits_e; + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + enum bit [10:0] { + STATE_RESET = (11'h1 << STATE_RESET_BIT) , + STATE_IDLE = (11'h1 << STATE_IDLE_BIT) , + STATE_DECODE = (11'h1 << STATE_DECODE_BIT) , + STATE_PRE = (11'h1 << STATE_PRE_BIT) , + STATE_TRP = (11'h1 << STATE_TRP_BIT) , + STATE_ACT = (11'h1 << STATE_ACT_BIT) , + STATE_TRCD = (11'h1 << STATE_TRCD_BIT) , + STATE_RW = (11'h1 << STATE_RW_BIT) , + STATE_ADDR_INC = (11'h1 << STATE_ADDR_INC_BIT) , + STATE_PRE_ALL = (11'h1 << STATE_PRE_ALL_BIT) , + STATE_REFR = (11'h1 << STATE_REFR_BIT) + } state, next_state; + + logic refr_mode ; + logic write_mode ; + + logic burst_done ; + logic early_burst_done; + + cola_t cola_latched ; + rowa_t rowa_latched ; + ba_t ba_latched ; + chid_t chid_latched ; + + logic [3:0] burst_latched ; + logic [3:0] burst_shift_cnt ; + + logic [3:0] available_burst ; + + logic [3:0] remained_burst ; + logic [1:0] remained_burst_high ; + logic [1:0] remained_burst_low ; + logic [1:0] remained_burst_low_latched; + + logic [3:0] last_used_burst; + + wire trp_cnt_done; + wire trcd_cnt_done; + + //-------------------------------------------------------------------------------------------------- + // use shift register instead of counter for trp time count + //-------------------------------------------------------------------------------------------------- + + generate + if (cTrp_m1 <= 1) begin : no_trp_cnt_generate + + assign trp_cnt_done = 1'b1; + + end + else begin : trp_cnt_generate + + logic [cTrp_m1-2:0] trp_cnt; + + always_ff @(posedge clk) begin + if (state [STATE_TRP_BIT]) + trp_cnt <= (trp_cnt << 1) | 1'b1; + else + trp_cnt <= '0; + end + + assign trp_cnt_done = trp_cnt [cTrp_m1-2]; + + end + endgenerate + + //-------------------------------------------------------------------------------------------------- + // use shift register instead of counter for trcd time count + //-------------------------------------------------------------------------------------------------- + + generate + if (cTrcd_m1 <= 1) begin : no_trcd_cnt_generate + + assign trcd_cnt_done = 1'b1; + + end + else begin : trcd_cnt_generate + + logic [cTrcd_m1-2:0] trcd_cnt; + + always_ff @(posedge clk) begin + if (state [STATE_TRCD_BIT]) + trcd_cnt <= (trcd_cnt << 1) | 1'b1; + else + trcd_cnt <= '0; + end + + assign trcd_cnt_done = trcd_cnt [cTrcd_m1-2]; + + end + endgenerate + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + always_comb begin : fsm_jump_decode + + next_state = STATE_RESET; + + unique case (1'b1) + + state [STATE_RESET_BIT] : begin + next_state = STATE_IDLE; + end + + state [STATE_IDLE_BIT] : begin + if (arb_write | arb_read | arb_refr) + next_state = STATE_DECODE; + else + next_state = STATE_IDLE; + end + // + // decode branch + // + state [STATE_DECODE_BIT] : begin + if (refr_mode) begin : shorten_refresh_decode + + if (ba_map_all_close) + next_state = STATE_REFR; + else + next_state = STATE_PRE_ALL; + + end + else begin : mode_of_rw_decode + + if (ba_map_pre_act_rw) + next_state = STATE_PRE; + else if (ba_map_rw) + next_state = STATE_RW; + else // if (ba_map_act_rw) + next_state = STATE_ACT; + + end + end + // + // pre branch + // + state [STATE_PRE_BIT] : begin + if (dec_pre_enable) + + if (cTrp_m1 == 0) + next_state = STATE_ACT; + else + next_state = STATE_TRP; + + else + next_state = STATE_PRE; + end + + state [STATE_TRP_BIT] : begin + if (trp_cnt_done) + next_state = STATE_ACT; + else + next_state = STATE_TRP; + end + // + // act branch + // + state [STATE_ACT_BIT] : begin + if (dec_act_enable) + + if (cTrcd_m1 == 0) + next_state = STATE_RW; + else + next_state = STATE_TRCD; + + else + next_state = STATE_ACT; + end + + state [STATE_TRCD_BIT] : begin + if (trcd_cnt_done) + next_state = STATE_RW; + else + next_state = STATE_TRCD; + end + // + // data branch + // + state [STATE_RW_BIT] : begin + if ((dec_write_enable & write_mode) | (dec_read_enable & ~write_mode)) begin : burst_done_decode + + if (burst_done) + next_state = STATE_IDLE; + else + next_state = STATE_ADDR_INC; + + end + else begin + next_state = STATE_RW; + end + end + + state [STATE_ADDR_INC_BIT] : begin + next_state = STATE_RW; + end + // + // refresh breanch + // + state [STATE_PRE_ALL_BIT] : begin + if (dec_pre_all_enable) + next_state = STATE_REFR; + else + next_state = STATE_PRE_ALL; + end + + state [STATE_REFR_BIT] : begin + if (dec_refr_enable) + next_state = STATE_IDLE; + else + next_state = STATE_REFR; + end + + endcase + end + + //--------------------------------------------------------------------------------------------------- + // + //--------------------------------------------------------------------------------------------------- + + always_ff @(posedge clk or posedge reset) begin : fsm_register_process + if (reset) state <= STATE_RESET; + else if (sclr) state <= STATE_RESET; + else state <= next_state; + end + + //--------------------------------------------------------------------------------------------------- + // + //--------------------------------------------------------------------------------------------------- + + assign arb_ready = state[STATE_IDLE_BIT]; + + assign dec_pre_all = state[STATE_PRE_ALL_BIT]; + assign dec_refr = state[STATE_REFR_BIT]; + assign dec_pre = state[STATE_PRE_BIT]; + assign dec_act = state[STATE_ACT_BIT]; + assign dec_read = state[STATE_RW_BIT] & ~write_mode; + assign dec_write = state[STATE_RW_BIT] & write_mode; + assign dec_last = state[STATE_RW_BIT] & burst_done ; + + // + // instead of decode state_refr_bit & state_pre_all_bit we can use refresh mode register + // + + assign dec_locked = refr_mode; + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + assign ba_map_update = state[STATE_DECODE_BIT] & ~refr_mode; + assign ba_map_clear = state[STATE_DECODE_BIT] & refr_mode; + + always_ff @(posedge clk) begin : mode_logic + if (state [STATE_IDLE_BIT]) begin + refr_mode <= arb_refr; + write_mode <= arb_write; + end + end + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + always_ff @(posedge clk) begin : addr_chid_logic + + if (state[STATE_IDLE_BIT]) begin + rowa_latched <= arb_rowa; + ba_latched <= arb_ba; + chid_latched <= arb_chid; + end + + if (state[STATE_IDLE_BIT]) + cola_latched <= arb_cola; + else if (state[STATE_ADDR_INC_BIT]) + cola_latched <= cola_latched + last_used_burst; + + end + + assign dec_cola = cola_latched; + assign dec_rowa = rowa_latched; + assign dec_ba = ba_latched; + assign dec_chid = chid_latched; + + + //-------------------------------------------------------------------------------------------------- + // alligned burst max cycles is 4 + // burst [3:2] == 0 & burst[1:0] <= available_burst. 1 cycle is burst + // burst [3:2] != 0 & burst[1:0] <= available_burst. 1 cycle is burst shift_cnt burst_done + // burst [ 1.. 4] : encoded with [ 4'd0 : 4'd3] : cycle is 1 : burst_shift_cnt = 4'b0000 1 + // burst [ 5.. 8] : encoded with [ 4'd4 : 4'd7] : cycle is 2 : burst_shift_cnt = 4'b0001 0 + // burst [ 9..12] : encoded with [ 4'd8 : 4'd11] : cycle is 3 : burst_shift_cnt = 4'b0010 0 + // burst [13..16] : encoded with [4'd12 : 4'd15] : cycle is 4 : burst_shift_cnt = 4'b0100 0 + // + + // not alligned burst max cycles is 5 shift_cnt burst_done + // burst [ 1.. 4] : encoded with [ 4'd0 : 4'd3] : cycle is 2 : burst_shift_cnt = 4'b0001 0 + // burst [ 5.. 8] : encoded with [ 4'd4 : 4'd7] : cycle is 3 : burst_shift_cnt = 4'b0010 0 + // burst [ 9..12] : encoded with [ 4'd8 : 4'd11] : cycle is 4 : burst_shift_cnt = 4'b0100 0 + // burst [13..16] : encoded with [4'd12 : 4'd15] : cycle is 5 : burst_shift_cnt = 4'b1000 0 + //-------------------------------------------------------------------------------------------------- + + always_ff @(posedge clk) begin : burst_latch_logic + if (state[STATE_IDLE_BIT]) + burst_latched = arb_burst; + end + + // remember that burst has -1 offset + // available burst has -1 offset too + + assign available_burst = 4'b0011 - {2'b00, cola_latched[1:0]}; + + assign remained_burst = burst_latched - available_burst - 1'b1; + assign remained_burst_high = remained_burst[3:2]; + assign remained_burst_low = remained_burst[1:0]; + + assign early_burst_done = burst_shift_cnt[0]; + + always_ff @(posedge clk) begin : burst_logic + if (state[STATE_DECODE_BIT]) begin + + if (burst_latched <= available_burst) begin + + burst_shift_cnt <= '0; + + burst_done <= 1'b1; // only 1 transaction will be + dec_burst <= burst_latched[1:0]; + + end + else begin + + burst_shift_cnt <= '0; + burst_shift_cnt[remained_burst_high] <= 1'b1; + + remained_burst_low_latched <= remained_burst_low; + + burst_done <= 1'b0; // more then 2 transaction will be + + dec_burst <= available_burst[1:0]; + last_used_burst <= {2'b00, available_burst[1:0]} + 1'b1; // + 1 is compensation of -1 offset + + end + end + else if (state[STATE_ADDR_INC_BIT]) begin + + burst_shift_cnt <= burst_shift_cnt >> 1; + + burst_done <= early_burst_done; + // + if (early_burst_done) + dec_burst <= remained_burst_low_latched; // no transaction any more + else + dec_burst <= 2'b11; + // + last_used_burst <= 4'b0011 + 1'b1; + end + end + +endmodule
hssdrc/trunk/rtl/hssdrc_decoder_state.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/rtl/hssdrc_addr_path.v =================================================================== --- hssdrc/trunk/rtl/hssdrc_addr_path.v (nonexistent) +++ hssdrc/trunk/rtl/hssdrc_addr_path.v (revision 3) @@ -0,0 +1,207 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:52:43 $ +// +// Workfile : hssdrc_addr_path.v +// +// Description : coder for translate logical onehot command to sdram command +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +`include "hssdrc_timescale.vh" + +`include "hssdrc_define.vh" + + +module hssdrc_addr_path( + clk , + reset , + sclr , + // + arb_pre_all , + arb_refr , + arb_pre , + arb_act , + arb_read , + arb_write , + arb_lmr , + arb_rowa , + arb_cola , + arb_ba , + // + addr , + ba , + cke , + cs_n , + ras_n , + cas_n , + we_n + ); + + input wire clk; + input wire reset; + input wire sclr; + + //-------------------------------------------------------------------------------------------------- + // interface from output arbiter + //-------------------------------------------------------------------------------------------------- + + input wire arb_pre_all ; + input wire arb_refr ; + input wire arb_pre ; + input wire arb_act ; + input wire arb_read ; + input wire arb_write ; + input wire arb_lmr ; + input rowa_t arb_rowa ; + input cola_t arb_cola ; + input ba_t arb_ba ; + + //-------------------------------------------------------------------------------------------------- + // interface to sdram + //-------------------------------------------------------------------------------------------------- + + output sdram_addr_t addr; + output ba_t ba; + output logic cke; + output logic cs_n; + output logic ras_n; + output logic cas_n; + output logic we_n; + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + logic [3:0] cs_n__ras_n__cas_n__we_n; + + // synthesis translate_off + wire [6:0] arb_cmd = {arb_pre_all, arb_refr, arb_pre, arb_act, arb_write, arb_read, arb_lmr}; + arb_cmd_assert : assert property (@(posedge clk) disable iff (reset) (arb_cmd !== 0) |-> $onehot(arb_cmd)); + // synthesis translate_on + + always_comb begin : logical_command_decode + + cs_n__ras_n__cas_n__we_n = 4'b0111; // nop + + unique case (1'b1) + arb_pre_all : cs_n__ras_n__cas_n__we_n = 4'b0010; // Pre + arb_refr : cs_n__ras_n__cas_n__we_n = 4'b0001; // Refr + arb_pre : cs_n__ras_n__cas_n__we_n = 4'b0010; // Pre + arb_act : cs_n__ras_n__cas_n__we_n = 4'b0011; // Act + arb_write : cs_n__ras_n__cas_n__we_n = 4'b0100; // Write + arb_read : cs_n__ras_n__cas_n__we_n = 4'b0101; // Read + arb_lmr : cs_n__ras_n__cas_n__we_n = 4'b0000; // Lmr (data == address) + default : begin end + endcase + end + + // + // don't use clocking disable + // + + assign cke = 1'b1; + + // synthesis translate_off + initial begin + {cs_n, ras_n, cas_n, we_n} <= 4'b1111; // only to disable mt48lc2m warnings + end + // synthesis translate_on + + always_ff @(posedge clk or posedge reset) begin : sdram_control_register + if (reset) {cs_n, ras_n, cas_n, we_n} <= 4'b1111; // inheribit nop + else if (sclr) {cs_n, ras_n, cas_n, we_n} <= 4'b1111; // inheribit nop + else {cs_n, ras_n, cas_n, we_n} <= cs_n__ras_n__cas_n__we_n; + end + + always_ff @(posedge clk) begin : sdram_mux_addr_path + + ba <= arb_ba; + + if (arb_act | arb_lmr) + addr <= ResizeRowa(arb_rowa); + else + addr <= ResizeCola(arb_cola, arb_pre_all); + + end + + //-------------------------------------------------------------------------------------------------- + // function to get sdram address from row address. row address is transfered during + // act/lmr sdram command and is directly mapped to row address. + //-------------------------------------------------------------------------------------------------- + + function sdram_addr_t ResizeRowa (input rowa_t rowa); + int i; + sdram_addr_t addr_resized; + + for (i = 0; i < pSdramAddrBits; i++) begin + if (pRowaBits > i) + addr_resized[i] = rowa[i]; + else + addr_resized[i] = 1'b0; + end + + return addr_resized; + endfunction + + //-------------------------------------------------------------------------------------------------- + // function to get sdram address from column address. column address is transfered during : + // 1. read/write sdram command and A10 is autoprecharge bit and if pColaBits > 10 then + // cola [$:10] is mapped to addr [$:11]. + // 2. pre sdram command and A10 is select all banks bit + //-------------------------------------------------------------------------------------------------- + + function sdram_addr_t ResizeCola (input cola_t cola, input bit pre_all); + int i; + sdram_addr_t addr_resized; + + for (i = 0; i < pSdramAddrBits; i++) begin + if (i < 10) begin + if (pColaBits > i) + addr_resized[i] = cola[i]; + else + addr_resized[i] = 1'b0; + end + else if (i == 10) begin + addr_resized[i] = pre_all; // Autoprecharge is not used -> A10 is always 1'b0 then read/write active + end + else begin + if (pColaBits > i) + addr_resized[i] = cola[i-1]; + else + addr_resized[i] = 1'b0; + end + end + + return addr_resized; + endfunction + +endmodule
hssdrc/trunk/rtl/hssdrc_addr_path.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/rtl/hssdrc_addr_path_p1.v =================================================================== --- hssdrc/trunk/rtl/hssdrc_addr_path_p1.v (nonexistent) +++ hssdrc/trunk/rtl/hssdrc_addr_path_p1.v (revision 3) @@ -0,0 +1,216 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:52:43 $ +// +// Workfile : hssdrc_addr_path_p1.v +// +// Description : coder for translate logical onehot command to sdram command +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +`include "hssdrc_timescale.vh" + +`include "hssdrc_define.vh" + + +module hssdrc_addr_path_p1( + clk , + reset , + sclr , + // + arb_pre_all , + arb_refr , + arb_pre , + arb_act , + arb_read , + arb_write , + arb_lmr , + arb_rowa , + arb_cola , + arb_ba , + // + addr , + ba , + cke , + cs_n , + ras_n , + cas_n , + we_n + ); + + input wire clk; + input wire reset; + input wire sclr; + + //-------------------------------------------------------------------------------------------------- + // interface from output arbiter + //-------------------------------------------------------------------------------------------------- + + input wire arb_pre_all ; + input wire arb_refr ; + input wire arb_pre ; + input wire arb_act ; + input wire arb_read ; + input wire arb_write ; + input wire arb_lmr ; + input rowa_t arb_rowa ; + input cola_t arb_cola ; + input ba_t arb_ba ; + + //-------------------------------------------------------------------------------------------------- + // interface to sdram + //-------------------------------------------------------------------------------------------------- + + output sdram_addr_t addr; + output ba_t ba; + output logic cke; + output logic cs_n; + output logic ras_n; + output logic cas_n; + output logic we_n; + + // + // + // + + logic [3:0] cs_n__ras_n__cas_n__we_n; + + sdram_addr_t addr_latched; + ba_t ba_latched; + + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + always_ff @(posedge clk or posedge reset) begin : logical_command_decode + if (reset) + cs_n__ras_n__cas_n__we_n <= 4'b1111; // inheribit nop + else if (sclr) + cs_n__ras_n__cas_n__we_n <= 4'b1111; // inheribit nop + else begin + unique case (1'b1) + arb_pre_all : cs_n__ras_n__cas_n__we_n <= 4'b0010; // Pre + arb_refr : cs_n__ras_n__cas_n__we_n <= 4'b0001; // Refr + arb_pre : cs_n__ras_n__cas_n__we_n <= 4'b0010; // Pre + arb_act : cs_n__ras_n__cas_n__we_n <= 4'b0011; // Act + arb_write : cs_n__ras_n__cas_n__we_n <= 4'b0100; // Write + arb_read : cs_n__ras_n__cas_n__we_n <= 4'b0101; // Read + arb_lmr : cs_n__ras_n__cas_n__we_n <= 4'b0000; // Lmr (data == address) + default : cs_n__ras_n__cas_n__we_n <= 4'b0111; + endcase + end + end + + // + // don't use clocking disable + // + + assign cke = 1'b1; + + // synthesis translate_off + initial begin + {cs_n, ras_n, cas_n, we_n} <= 4'b1111; // only to disable mt48lc2m warnings + end + // synthesis translate_on + + always_ff @(posedge clk or posedge reset) begin : sdram_control_register + if (reset) {cs_n, ras_n, cas_n, we_n} <= 4'b1111; // inheribit nop + else if (sclr) {cs_n, ras_n, cas_n, we_n} <= 4'b1111; // inheribit nop + else {cs_n, ras_n, cas_n, we_n} <= cs_n__ras_n__cas_n__we_n; + end + + always_ff @(posedge clk) begin : sdram_mux_addr_path + + ba_latched <= arb_ba; + ba <= ba_latched; + + + if (arb_act | arb_lmr) + addr_latched <= ResizeRowa(arb_rowa); + else + addr_latched <= ResizeCola(arb_cola, arb_pre_all); + + addr <= addr_latched; + end + + //-------------------------------------------------------------------------------------------------- + // function to get sdram address from row address. row address is transfered during + // act/lmr sdram command and is directly mapped to row address. + //-------------------------------------------------------------------------------------------------- + + function sdram_addr_t ResizeRowa (input rowa_t rowa); + int i; + sdram_addr_t addr_resized; + + for (i = 0; i < pSdramAddrBits; i++) begin + if (pRowaBits > i) + addr_resized[i] = rowa[i]; + else + addr_resized[i] = 1'b0; + end + + return addr_resized; + endfunction + + //-------------------------------------------------------------------------------------------------- + // function to get sdram address from column address. column address is transfered during : + // 1. read/write sdram command and A10 is autoprecharge bit and if pColaBits > 10 then + // cola [$:10] is mapped to addr [$:11]. + // 2. pre sdram command and A10 is select all banks bit + //-------------------------------------------------------------------------------------------------- + + function sdram_addr_t ResizeCola (input cola_t cola, input bit pre_all); + int i; + sdram_addr_t addr_resized; + + for (i = 0; i < pSdramAddrBits; i++) begin + if (i < 10) begin + if (pColaBits > i) + addr_resized[i] = cola[i]; + else + addr_resized[i] = 1'b0; + end + else if (i == 10) begin + addr_resized[i] = pre_all; // Autoprecharge is not used -> A10 is always 1'b0 then read/write active + end + else begin + if (pColaBits > i) + addr_resized[i] = cola[i-1]; + else + addr_resized[i] = 1'b0; + end + end + + return addr_resized; + endfunction + +endmodule
hssdrc/trunk/rtl/hssdrc_addr_path_p1.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/rtl/hssdrc_mux.v =================================================================== --- hssdrc/trunk/rtl/hssdrc_mux.v (nonexistent) +++ hssdrc/trunk/rtl/hssdrc_mux.v (revision 3) @@ -0,0 +1,153 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:52:43 $ +// +// Workfile : hssdrc_mux.v +// +// Description : multiplexer for sdram signals +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +`include "hssdrc_timescale.vh" + +`include "hssdrc_define.vh" + +module hssdrc_mux + ( + init_done , + // + init_state_pre_all , + init_state_refr , + init_state_lmr , + init_state_rowa , + // + arb_pre_all , + arb_refr , + arb_pre , + arb_act , + arb_read , + arb_write , + arb_rowa , + arb_cola , + arb_ba , + arb_chid , + arb_burst , + // + mux_pre_all , + mux_refr , + mux_pre , + mux_act , + mux_read , + mux_write , + mux_lmr , + mux_rowa , + mux_cola , + mux_ba , + mux_chid , + mux_burst + ); + + input wire init_done; + + //-------------------------------------------------------------------------------------------------- + // interface from inis state controller + //-------------------------------------------------------------------------------------------------- + + input wire init_state_pre_all ; + input wire init_state_refr ; + input wire init_state_lmr ; + input rowa_t init_state_rowa ; + + //-------------------------------------------------------------------------------------------------- + // interface from output arbiter + //-------------------------------------------------------------------------------------------------- + + input wire arb_pre_all ; + input wire arb_refr ; + input wire arb_pre ; + input wire arb_act ; + input wire arb_read ; + input wire arb_write ; + input rowa_t arb_rowa ; + input cola_t arb_cola ; + input ba_t arb_ba ; + input chid_t arb_chid ; + input sdram_burst_t arb_burst ; + + //-------------------------------------------------------------------------------------------------- + // interface to data/addr path units + //-------------------------------------------------------------------------------------------------- + + output logic mux_pre_all ; + output logic mux_refr ; + output logic mux_pre ; + output logic mux_act ; + output logic mux_read ; + output logic mux_write ; + output logic mux_lmr ; + output rowa_t mux_rowa ; + output cola_t mux_cola ; + output ba_t mux_ba ; + output chid_t mux_chid ; + output sdram_burst_t mux_burst ; + + //------------------------------------------------------------------------------------------------- + // there is no reason to mask or mux arbiter_if signals, becouse during init state phase + // init_done == 0 and this signals is cleared inside decoders and after init state phase + // init_done == 1 and init_state_if signals will be cleared also + //------------------------------------------------------------------------------------------------- + + assign mux_pre_all = arb_pre_all | init_state_pre_all; + assign mux_refr = arb_refr | init_state_refr ; + + // this will be synthesis as simple logic, becouse init_state_rowa is constant + assign mux_rowa = init_done ? arb_rowa : init_state_rowa ; + + assign mux_pre = arb_pre ; + assign mux_act = arb_act ; + assign mux_read = arb_read ; + assign mux_write = arb_write ; + + assign mux_lmr = init_state_lmr; + + // + // no mux becouse init state phase not use this sdram ports + // + + assign mux_cola = arb_cola ; + assign mux_ba = arb_ba ; + assign mux_burst = arb_burst; + assign mux_chid = arb_chid ; + +endmodule + + +
hssdrc/trunk/rtl/hssdrc_mux.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/rtl/hssdrc_access_manager.v =================================================================== --- hssdrc/trunk/rtl/hssdrc_access_manager.v (nonexistent) +++ hssdrc/trunk/rtl/hssdrc_access_manager.v (revision 3) @@ -0,0 +1,538 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:52:43 $ +// +// Workfile : hssdrc_access_manager.v +// +// Description : sdram bank access manager +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +// used command sequenceces +// 1. {pre a -> act a -> rw a} -> {pre a -> act a -> rw a } +// -> {rw a } +// -> {pre_all -> refr} +// 2. {pre a -> act a -> rw a} -> {pre b -> act b -> rw b } +// -> {act b -> rw b} +// -> {rw b } +// -> {pre_all -> refr} +// 3. {pre_all -> refr} -> refr +// -> act +// +// just need to control : +// +-------------------+-------------------------+--------------------------+ +// | command | sequental decoder part | concurent/pipeline part | +// +===================+=========================+==========================+ +// | pre [0] -> | act [0] | act [1,2,3] | +// | pre [0] -> | | pre [1,2,3] | +// +-------------------+-------------------------+--------------------------+ +// | pre [1] -> | act [1] | act [0,2,3] | +// | pre [1] -> | | pre [0,2,3] | +// +-------------------+-------------------------+--------------------------+ +// | pre [2] -> | act [2] | act [0,1,3] | +// | pre [2] -> | | pre [0,1,3] | +// +-------------------+-------------------------+--------------------------+ +// | pre [3] -> | act [3] | act [0,1,2] | +// | pre [3] -> | | pre [0,1,2] | +// +-------------------+-------------------------+--------------------------+ +// | act [0] -> | write [0] | | +// | act [0] -> | | act [1,2,3] | +// | act [0] -> | | pre [0,1,2,3] | +// | act [0] -> | read [0] | | +// +-------------------+-------------------------+--------------------------+ +// | act [1] -> | write [1] | | +// | act [1] -> | | act [0,2,3] | +// | act [1] -> | | pre [0,1,2,3] | +// | act [1] -> | read [1] | | +// +-------------------+-------------------------+--------------------------+ +// | act [2] -> | write [2] | | +// | act [2] -> | | act [0,1,3] | +// | act [2] -> | | pre [0,1,2,3] | +// | act [2] -> | read [2] | | +// +-------------------+-------------------------+--------------------------+ +// | act [3] -> | write [3] | | +// | act [3] -> | | act [0,1,2] | +// | act [3] -> | | pre [0,1,2,3] | +// | act [3] -> | read [3] | | +// +-------------------+-------------------------+--------------------------+ +// | write/read [0] -> | | pre [0,1,2,3] | +// | write/read [0] -> | | act [1,2,3] | +// | write/read [0] -> | | write[0,1,2,3] | +// | write/read [0] -> | | read [0,1,2,3] | +// +-------------------+-------------------------+--------------------------+ +// | write/read [1] -> | | pre [0,1,2,3] | +// | write/read [1] -> | | act [0,2,3] | +// | write/read [1] -> | | write[0,1,2,3] | +// | write/read [1] -> | | read [0,1,2,3] | +// +-------------------+-------------------------+--------------------------+ +// | write/read [2] -> | | pre [0,1,2,3] | +// | write/read [2] -> | | act [0,1,3] | +// | write/read [2] -> | | write[0,1,2,3] | +// | write/read [2] -> | | read [0,1,2,3] | +// +-------------------+-------------------------+--------------------------+ +// | write/read [3] -> | | pre [0,1,2,3] | +// | write/read [3] -> | | act [0,1,2] | +// | write/read [3] -> | | write[0,1,2,3] | +// | write/read [3] -> | | read [0,1,2,3] | +// +-------------------+-------------------------+--------------------------+ +// | pre_all -> | refr | | +// | | | | +// +-------------------+-------------------------+--------------------------+ +// | refr -> | | refr | +// | refr -> | | act[0,1,2,3] | +// +-------------------+-------------------------+--------------------------+ +// +// +// +// +-----------------+---------------+-----------------+---------------------+-----------+ +// | past command | control tread | current command | contol time value | note | +// +=================+===============+=================+=====================+===========+ +// | act [0] | 0 | pre [0] | Tras | | +// | write [0] | 1 | | Twr + Burst | 1,2,3 | +// | read [0] | 2 | | Burst | bank | +// | pre [1,2,3] | | | 0 | is | +// | act [1,2,3] | | | 0 | same | +// | write [1,2,3] | | | 0 | | +// | read [1,2,3] | | | 0 | | +// +-----------------+---------------+-----------------+---------------------+-----------+ +// | pre [0] | 3 [1]_ | act [0] | Trp | | +// | refr | 4 | | Trfc | 1,2,3 | +// | act [0] | 5 | | Trc | | +// | act [1,2,3] | 6 | | Trrd | bank | +// | pre [1,2,3] | | | 0 | is | +// | write [1,2,3] | | | 0 | same | +// | read [1,2,3] | | | 0 | | +// +-----------------+---------------+-----------------+---------------------+-----------+ +// | act [0] | 7 [1]_ | write [0] | Trcd | 1,2,3 | +// | write [0,1,2,3] | 8 | | Burst | bank | +// | read [0,1,2,3] | 9 | | Burst + CL + 1(?bta)| is | +// | | | | | same | +// +-----------------+---------------+-----------------+---------------------+-----------+ +// | act [0] | 10 [1]_ | read [0] | Trcd | 1,2,3 | +// | write [0,1,2,3] | 11 | | Burst + 1(?bta) | bank | +// | read [0,1,2,3] | 12 | | Burst | is | +// | | | | | same | +// +-----------------+---------------+-----------------+---------------------+-----------+ +// | pre_all | 13 | refr | Trp | | +// | refr | 14 | | Trfc | | +// +-----------------+---------------+-----------------+---------------------+-----------+ +// +// ..[1] Trp (pre -> act) & Trcd (act -> read/write) contolled internal in decoder FSM +// + +`include "hssdrc_timescale.vh" + +`include "hssdrc_define.vh" +`include "hssdrc_timing.vh" + +module hssdrc_access_manager ( + clk , + reset , + sclr , + // + arb_pre_all , + arb_refr , + arb_pre , + arb_act , + arb_read , + arb_write , + arb_ba , + arb_burst , + // + am_pre_all_enable , + am_refr_enable , + am_pre_enable , + am_act_enable , + am_read_enable , + am_write_enable + ); + + input wire clk; + input wire reset; + input wire sclr; + + //-------------------------------------------------------------------------------------------------- + // interface from output arbiter + //-------------------------------------------------------------------------------------------------- + + input logic arb_pre_all ; + input logic arb_refr ; + input logic arb_pre ; + input logic arb_act ; + input logic arb_read ; + input logic arb_write ; + input ba_t arb_ba ; + input sdram_burst_t arb_burst ; + + //-------------------------------------------------------------------------------------------------- + // outputs + //-------------------------------------------------------------------------------------------------- + + output logic am_pre_all_enable ; + output logic am_refr_enable ; + output logic [0:3] am_pre_enable ; + output logic [0:3] am_act_enable ; + output logic [0:3] am_read_enable ; + output logic [0:3] am_write_enable ; + + + //-------------------------------------------------------------------------------------------------- + // all timings is select using shift register techique. + // enable is 1'b1 level on output. + // all shift is shift rigth. + // shift register command load pattern is 'b{{x{1'b0}}, {y{1'b1}}} + //-------------------------------------------------------------------------------------------------- + + //-------------------------------------------------------------------------------------------------- + // take into acount load shift register cycle + //-------------------------------------------------------------------------------------------------- + + localparam int cTras_m1 = cTras - 1; + localparam int cTrfc_m1 = cTrfc - 1; +// localparam int cTrc_m1 = cTrc - 1; tras + trp contolled +// localparam int cTrcd_m1 = cTrcd - 1; fsm contolled + localparam int cTwr_m1 = cTwr - 1; + localparam int cTrp_m1 = cTrp - 1; + localparam int cTrrd_m1 = cTrrd - 1; + localparam int cSdramBL_m1 = cSdramBL - 1; + + //-------------------------------------------------------------------------------------------------- + // tread 0/1/2 : Tras (act -> pre) & Twr + Burst (write -> pre) & Burst (read -> write) + // Twr + Burst & Burst control via one register becouse write/read has atomic access + //-------------------------------------------------------------------------------------------------- + + localparam int cPreActEnableLength = max(cTwr_m1 + cSdramBL_m1, cTras_m1); + localparam int cPreRwEnableLength = max(cTwr_m1 + cSdramBL_m1, cTras_m1); + + typedef logic [cPreActEnableLength-1:0] pre_act_enable_srl_t; + typedef logic [cPreRwEnableLength-1 :0] pre_rw_enable_srl_t; + + // to pre load patterns + localparam pre_act_enable_srl_t cPreActEnableInitValue = {cPreActEnableLength{1'b1}}; + localparam pre_act_enable_srl_t cPreActEnableActValue = PercentRelation(cTras_m1, cPreActEnableLength); + + // to pre load patterns + localparam pre_rw_enable_srl_t cPreRwEnableInitValue = {cPreRwEnableLength{1'b1}}; + + // Remember : burst already has -1 offset (!!!!) + function automatic pre_rw_enable_srl_t PreRwEnableWriteValue (input sdram_burst_t burst); + PreRwEnableWriteValue = PercentRelation (cTwr_m1 + burst, cPreRwEnableLength); + endfunction + + function automatic pre_rw_enable_srl_t PreRwEnableReadValue (input sdram_burst_t burst); + PreRwEnableReadValue = PercentRelation (burst, cPreRwEnableLength); + endfunction + + // each bank has own control registers + pre_act_enable_srl_t pre_act_enable_srl [0:3]; + pre_rw_enable_srl_t pre_rw_enable_srl [0:3]; + + wire [0:3] pre_enable ; + + genvar p; + + generate + + for (p = 0; p < 4; p++) begin : pre_enable_generate + + always_ff @(posedge clk or posedge reset) begin : pre_enable_shift_register + + if (reset) + pre_act_enable_srl [p] <= cPreActEnableInitValue; + else if (sclr) + pre_act_enable_srl [p] <= cPreActEnableInitValue; + else begin + if (arb_act && (arb_ba == p)) + pre_act_enable_srl [p] <= cPreActEnableActValue; + else + pre_act_enable_srl [p] <= (pre_act_enable_srl [p] << 1) | 1'b1; + end + + + if (reset) + pre_rw_enable_srl [p] <= cPreRwEnableInitValue; + else if (sclr) + pre_rw_enable_srl [p] <= cPreRwEnableInitValue; + else begin + if (arb_write && (arb_ba == p)) + pre_rw_enable_srl [p] <= PreRwEnableWriteValue (arb_burst) & ((pre_act_enable_srl [p] << 1) | 1'b1); + else if (arb_read && (arb_ba == p)) + pre_rw_enable_srl [p] <= PreRwEnableReadValue (arb_burst) & ((pre_act_enable_srl [p] << 1) | 1'b1); + else + pre_rw_enable_srl [p] <= (pre_rw_enable_srl [p] << 1) | 1'b1; + end + + end + + assign pre_enable [p] = pre_rw_enable_srl [p] [cPreRwEnableLength-1] ; + + end + + endgenerate + + //-------------------------------------------------------------------------------------------------- + // pre_all_enable has same logic as pre enable. + // pre_all_enable == &(pre_enable), but for increase performance it have own control registers + //-------------------------------------------------------------------------------------------------- + + pre_act_enable_srl_t pre_all_act_enable_srl ; + pre_rw_enable_srl_t pre_all_rw_enable_srl ; + + wire pre_all_enable; + + always_ff @(posedge clk or posedge reset) begin : pre_all_enable_shift_register + + if (reset) + pre_all_act_enable_srl <= cPreActEnableInitValue; + else if (sclr) + pre_all_act_enable_srl <= cPreActEnableInitValue; + else begin + if (arb_act) + pre_all_act_enable_srl <= cPreActEnableActValue; + else + pre_all_act_enable_srl <= (pre_all_act_enable_srl << 1) | 1'b1; + end + + + if (reset) + pre_all_rw_enable_srl <= cPreRwEnableInitValue; + else if (sclr) + pre_all_rw_enable_srl <= cPreRwEnableInitValue; + else begin + if (arb_write) + pre_all_rw_enable_srl <= PreRwEnableWriteValue (arb_burst) & ((pre_all_act_enable_srl << 1) | 1'b1); + else if (arb_read) + pre_all_rw_enable_srl <= PreRwEnableReadValue (arb_burst) & ((pre_all_act_enable_srl << 1) | 1'b1); + else + pre_all_rw_enable_srl <= (pre_all_rw_enable_srl << 1) | 1'b1; + end + + end + + assign pre_all_enable = pre_all_rw_enable_srl [cPreRwEnableLength-1]; + + //-------------------------------------------------------------------------------------------------- + // tread 4/5/6 : Trfc (refr -> act) & Trc (act -> act) & Trrd (act a -> act b) + // Trc don't need to be contolled, becouse Trc = Tras + Trcd + // Trfc & Trrd control via one register becouse refr -> any act has locked & sequental access. + // for Trc we can use 1 register, becouse act a -> act a is imposible sequence + //-------------------------------------------------------------------------------------------------- + + localparam int cActEnableLength = max (cTrfc_m1, cTrrd_m1); + + typedef logic [cActEnableLength-1:0] act_enable_srl_t; + + // to act load patterns + localparam act_enable_srl_t cActEnableInitValue = {cActEnableLength{1'b1}}; + localparam act_enable_srl_t cActEnableRefrValue = PercentRelation(cTrfc_m1, cActEnableLength); + localparam act_enable_srl_t cActEnableActValue = PercentRelation(cTrrd_m1, cActEnableLength); + + act_enable_srl_t act_enable_srl ; + + wire [0:3] act_enable ; + + always_ff @(posedge clk or posedge reset) begin : act_enable_shift_register + + if (reset) + act_enable_srl <= cActEnableInitValue; + else if (sclr) + act_enable_srl <= cActEnableInitValue; + else begin + + if (arb_refr) + act_enable_srl <= cActEnableRefrValue; + else if (arb_act) + act_enable_srl <= cActEnableActValue; + else + act_enable_srl <= (act_enable_srl << 1) | 1'b1; + + end + end + + assign act_enable = {4{act_enable_srl [cActEnableLength-1]}} ; + + //-------------------------------------------------------------------------------------------------- + // tread 8/9 : Burst (write -> write) & Burst + CL + BTA (read -> write). + // control via one register becouse write/read -> write is atomic sequental access. + //-------------------------------------------------------------------------------------------------- + + localparam int cWriteEnableLength = max (cSdramBL_m1, cSdramBL_m1 + pCL + pBTA); + + typedef logic [cWriteEnableLength-1:0] write_enable_srl_t; + + // to write load patterns + localparam write_enable_srl_t cWriteEnableInitValue = {cWriteEnableLength{1'b1}}; + + // Remember : burst already has -1 offset (!!!!) + function automatic write_enable_srl_t WriteEnableWriteValue (input sdram_burst_t burst); + WriteEnableWriteValue = PercentRelation(burst, cWriteEnableLength); + endfunction + + function automatic write_enable_srl_t WriteEnableReadValue (input sdram_burst_t burst); + WriteEnableReadValue = PercentRelation(burst + pCL + pBTA, cWriteEnableLength); + endfunction + + write_enable_srl_t write_enable_srl; + + wire [0:3] write_enable ; + + always_ff @(posedge clk or posedge reset) begin : write_enable_shift_register + + if (reset) + write_enable_srl <= cWriteEnableInitValue; + else if (sclr) + write_enable_srl <= cWriteEnableInitValue; + else begin + if (arb_write) + write_enable_srl <= WriteEnableWriteValue (arb_burst); + else if (arb_read) + write_enable_srl <= WriteEnableReadValue (arb_burst); + else + write_enable_srl <= (write_enable_srl << 1) | 1'b1; + end + end + + assign write_enable = {4{write_enable_srl [cWriteEnableLength-1]}}; + + //-------------------------------------------------------------------------------------------------- + // tread 11/12 : Burst + BTA (write -> read) & Burst (read -> read). + // contorl via one register becouse write/read -> read is atomic sequental access + // BTA from write -> read is not need !!! becouse read have read latency !!!! + //-------------------------------------------------------------------------------------------------- + + localparam int cReadEnableLength = max(cSdramBL_m1, cSdramBL_m1); + + typedef logic [cReadEnableLength-1:0] read_enable_srl_t; + + // to read load patterns + localparam read_enable_srl_t cReadEnableInitValue = {cReadEnableLength{1'b1}}; + // Remember : burst already has -1 offset (!!!!) + function automatic read_enable_srl_t ReadEnableWriteValue (input sdram_burst_t burst); + ReadEnableWriteValue = PercentRelation(burst, cReadEnableLength); + endfunction + + function automatic read_enable_srl_t ReadEnableReadValue (input sdram_burst_t burst); + ReadEnableReadValue = PercentRelation(burst, cReadEnableLength); + endfunction + + read_enable_srl_t read_enable_srl; + + wire [0:3] read_enable ; + + always_ff @(posedge clk or posedge reset) begin : read_enable_shift_register + + if (reset) + read_enable_srl <= cReadEnableInitValue; + else if (sclr) + read_enable_srl <= cReadEnableInitValue; + else begin + if (arb_write) + read_enable_srl <= ReadEnableWriteValue (arb_burst); + else if (arb_read) + read_enable_srl <= ReadEnableReadValue (arb_burst); + else + read_enable_srl <= (read_enable_srl << 1) | 1'b1; + end + + end + + assign read_enable = {4{read_enable_srl [cReadEnableLength-1]}}; + + //-------------------------------------------------------------------------------------------------- + // tread 13/14 : Trp (pre_all -> refr) & Trfc (refr -> refr). + // contol via one register becouse pre_all/refr has locked access & (pre_all -> refr) has sequental access + //-------------------------------------------------------------------------------------------------- + + localparam int cRefrEnableLength = max (cTrp_m1, cTrfc_m1); + + typedef logic [cRefrEnableLength-1:0] refr_enable_srl_t; + + // to refr load patterns + localparam refr_enable_srl_t cRefrEnableInitValue = {cRefrEnableLength{1'b1}}; + localparam refr_enable_srl_t cRefrEnablePreAllValue = PercentRelation( cTrp_m1, cRefrEnableLength); + localparam refr_enable_srl_t cRefrEnableRefrValue = PercentRelation(cTrfc_m1, cRefrEnableLength); + + refr_enable_srl_t refr_enable_srl; + + wire refr_enable; + + always_ff @(posedge clk or posedge reset) begin : refr_enable_shift_register + + if (reset) + refr_enable_srl <= cRefrEnableInitValue; + else if (sclr) + refr_enable_srl <= cRefrEnableInitValue; + else begin + if (arb_pre_all) + refr_enable_srl <= cRefrEnablePreAllValue; + else if (arb_refr) + refr_enable_srl <= cRefrEnableRefrValue; + else + refr_enable_srl <= (refr_enable_srl << 1) | 1'b1; + end + + end + + assign refr_enable = refr_enable_srl [cRefrEnableLength-1]; + + //-------------------------------------------------------------------------------------------------- + // output mapping + //-------------------------------------------------------------------------------------------------- + + assign am_pre_all_enable = pre_all_enable; + assign am_refr_enable = refr_enable; + assign am_act_enable = act_enable; + assign am_pre_enable = pre_enable; + assign am_write_enable = write_enable; + assign am_read_enable = read_enable; + + //-------------------------------------------------------------------------------------------------- + // function to generate 'b{{{data}1'b0}, {{length-data}{1'b1}}} shift register load pattern + //-------------------------------------------------------------------------------------------------- + + function automatic int unsigned PercentRelation (input int unsigned data, length); + int unsigned value; + int i; + int ones_num; + + value = 0; + ones_num = length - data; // number of ones from lsb in constant vector + for ( i = 0; i < length; i++) begin + if (i < ones_num) value[i] = 1'b1; + else value[i] = 1'b0; + end + + return value; + endfunction + + +endmodule +
hssdrc/trunk/rtl/hssdrc_access_manager.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/rtl/hssdrc_refr_counter.v =================================================================== --- hssdrc/trunk/rtl/hssdrc_refr_counter.v (nonexistent) +++ hssdrc/trunk/rtl/hssdrc_refr_counter.v (revision 3) @@ -0,0 +1,131 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:52:43 $ +// +// Workfile : hssdrc_refr_counter.v +// +// Description : refresh time decode, counter based fsm +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +`include "hssdrc_timescale.vh" + +`include "hssdrc_timing.vh" +`include "hssdrc_define.vh" + +module hssdrc_refr_counter ( + clk , + reset , + sclr , + ack , + hi_req , + low_req + ); + + input wire clk ; + input wire reset ; + input wire sclr ; + + input wire ack ; + output logic hi_req ; + output logic low_req ; + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + localparam cCntWidth = clogb2(cRefCounterMaxTime); + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + logic [cCntWidth-1 : 0] cnt; + + // + // + // + + always_ff @(posedge clk or posedge reset) begin : refresh_interval_counter + if (reset) + cnt <= '0; + else if (sclr | ack) + cnt <= '0; + else + cnt <= cnt + 1'b1; + end + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + +`ifdef HSSDRC_REFR_LOW_DISABLE + + assign low_req = 1'b0; + +`else + + always_ff @(posedge clk or posedge reset) begin : low_priopity_refresh_request_set + if (reset) + low_req <= 1'b0; + else if (sclr | ack) + low_req <= 1'b0; + else if (cnt > cRefrWindowLowPriorityTime) + low_req <= 1'b1; + end + +`endif + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + +`ifdef HSSDRC_REFR_HI_DISABLE + + assign hi_req = 1'b0; + +`else + + always_ff @(posedge clk or posedge reset) begin : high_priority_refresh_request_set + if (reset) + hi_req <= 1'b0; + else if (sclr | ack) + hi_req <= 1'b0; + else if (cnt > cRefrWindowHighPriorityTime) + hi_req <= 1'b1; + end + +`endif + + // + // + // +endmodule
hssdrc/trunk/rtl/hssdrc_refr_counter.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/rtl/hssdrc_arbiter_in.v =================================================================== --- hssdrc/trunk/rtl/hssdrc_arbiter_in.v (nonexistent) +++ hssdrc/trunk/rtl/hssdrc_arbiter_in.v (revision 3) @@ -0,0 +1,255 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:52:43 $ +// +// Workfile : hssdrc_arbiter_in.v +// +// Description : input 3 way decode arbiter +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + + +`include "hssdrc_timescale.vh" + +`include "hssdrc_define.vh" + +module hssdrc_arbiter_in ( + clk , + reset , + sclr , + // + sys_write , + sys_read , + sys_refr , + sys_rowa , + sys_cola , + sys_ba , + sys_burst , + sys_chid_i , + sys_ready , + // + refr_cnt_ack , + refr_cnt_hi_req , + refr_cnt_low_req , + // + dec0_write , + dec0_read , + dec0_refr , + dec0_rowa , + dec0_cola , + dec0_ba , + dec0_burst , + dec0_chid , + dec0_ready , + // + dec1_write , + dec1_read , + dec1_refr , + dec1_rowa , + dec1_cola , + dec1_ba , + dec1_burst , + dec1_chid , + dec1_ready , + // + dec2_write , + dec2_read , + dec2_refr , + dec2_rowa , + dec2_cola , + dec2_ba , + dec2_burst , + dec2_chid , + dec2_ready + ); + + input wire clk ; + input wire reset ; + input wire sclr ; + + //-------------------------------------------------------------------------------------------------- + // interface from refresh cycle generator + //-------------------------------------------------------------------------------------------------- + + output logic refr_cnt_ack ; + input wire refr_cnt_hi_req ; + input wire refr_cnt_low_req ; + + //-------------------------------------------------------------------------------------------------- + // interface from system + //-------------------------------------------------------------------------------------------------- + + input wire sys_write ; + input wire sys_read ; + input wire sys_refr ; + input rowa_t sys_rowa ; + input cola_t sys_cola ; + input ba_t sys_ba ; + input burst_t sys_burst ; + input chid_t sys_chid_i ; + output logic sys_ready ; + + //-------------------------------------------------------------------------------------------------- + // interface to sdram sequence decoders + //-------------------------------------------------------------------------------------------------- + + output logic dec0_write ; + output logic dec0_read ; + output logic dec0_refr ; + output rowa_t dec0_rowa ; + output cola_t dec0_cola ; + output ba_t dec0_ba ; + output burst_t dec0_burst ; + output chid_t dec0_chid ; + input wire dec0_ready ; + // + output logic dec1_write ; + output logic dec1_read ; + output logic dec1_refr ; + output rowa_t dec1_rowa ; + output cola_t dec1_cola ; + output ba_t dec1_ba ; + output burst_t dec1_burst ; + output chid_t dec1_chid ; + input wire dec1_ready ; + // + output logic dec2_write ; + output logic dec2_read ; + output logic dec2_refr ; + output rowa_t dec2_rowa ; + output cola_t dec2_cola ; + output ba_t dec2_ba ; + output burst_t dec2_burst ; + output chid_t dec2_chid ; + input wire dec2_ready ; + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + wire sys_lock ; + wire low_req_lock ; + wire arb_write ; + wire arb_read ; + wire arb_refr ; + wire arb_ready ; + wire arb_ack ; + wire arb_refr_ack ; + logic [2:0] arb; + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + assign sys_lock = refr_cnt_hi_req; + assign low_req_lock = sys_write | sys_read | sys_refr; + + // + // + // + + assign arb_write = sys_write & ~sys_lock; + assign arb_read = sys_read & ~sys_lock; + assign arb_refr = sys_refr | refr_cnt_hi_req | (refr_cnt_low_req & ~low_req_lock); + assign arb_ready = dec0_ready | dec1_ready | dec2_ready; + + // + // + // + + assign arb_ack = arb_ready & (arb_write | arb_read | arb_refr); + assign arb_refr_ack = arb_ready & arb_refr ; + + // + // + // + + assign refr_cnt_ack = arb_refr_ack; + + // + // + // + + assign sys_ready = arb_ready & ~sys_lock; + + // + // + // + + always_ff @(posedge clk or posedge reset) begin : arbiter_logic + if (reset) + arb <= 3'b001; + else if (sclr) + arb <= 3'b001; + else if (arb_ack) + arb <= {arb[1:0], arb[2]}; + end + + // + // + // + + assign dec0_write = arb_write & arb[0]; + assign dec0_read = arb_read & arb[0]; + assign dec0_refr = arb_refr & arb[0]; + assign dec0_rowa = sys_rowa ; + assign dec0_cola = sys_cola ; + assign dec0_ba = sys_ba ; + assign dec0_burst = sys_burst ; + assign dec0_chid = sys_chid_i; + + // + // + // + + assign dec1_write = arb_write & arb[1]; + assign dec1_read = arb_read & arb[1]; + assign dec1_refr = arb_refr & arb[1]; + assign dec1_rowa = sys_rowa ; + assign dec1_cola = sys_cola ; + assign dec1_ba = sys_ba ; + assign dec1_burst = sys_burst ; + assign dec1_chid = sys_chid_i; + + // + // + // + + assign dec2_write = arb_write & arb[2]; + assign dec2_read = arb_read & arb[2]; + assign dec2_refr = arb_refr & arb[2]; + assign dec2_rowa = sys_rowa ; + assign dec2_cola = sys_cola ; + assign dec2_ba = sys_ba ; + assign dec2_burst = sys_burst ; + assign dec2_chid = sys_chid_i; + +endmodule
hssdrc/trunk/rtl/hssdrc_arbiter_in.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/rtl/hssdrc_arbiter_out.v =================================================================== --- hssdrc/trunk/rtl/hssdrc_arbiter_out.v (nonexistent) +++ hssdrc/trunk/rtl/hssdrc_arbiter_out.v (revision 3) @@ -0,0 +1,631 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:52:43 $ +// +// Workfile : hssdrc_arbiter_out.v +// +// Description : output 3 way decode arbiter +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +`include "hssdrc_timescale.vh" + +`include "hssdrc_define.vh" + +module hssdrc_arbiter_out ( + clk , + reset , + sclr , + // + dec0_pre_all , + dec0_refr , + dec0_pre , + dec0_act , + dec0_read , + dec0_write , + dec0_pre_all_enable, + dec0_refr_enable , + dec0_pre_enable , + dec0_act_enable , + dec0_read_enable , + dec0_write_enable , + dec0_locked , + dec0_last , + dec0_rowa , + dec0_cola , + dec0_ba , + dec0_chid , + dec0_burst , + // + dec1_pre_all , + dec1_refr , + dec1_pre , + dec1_act , + dec1_read , + dec1_write , + dec1_pre_all_enable, + dec1_refr_enable , + dec1_pre_enable , + dec1_act_enable , + dec1_read_enable , + dec1_write_enable , + dec1_locked , + dec1_last , + dec1_rowa , + dec1_cola , + dec1_ba , + dec1_chid , + dec1_burst , + // + dec2_pre_all , + dec2_refr , + dec2_pre , + dec2_act , + dec2_read , + dec2_write , + dec2_pre_all_enable, + dec2_refr_enable , + dec2_pre_enable , + dec2_act_enable , + dec2_read_enable , + dec2_write_enable , + dec2_locked , + dec2_last , + dec2_rowa , + dec2_cola , + dec2_ba , + dec2_chid , + dec2_burst , + // + am_pre_all_enable , + am_refr_enable , + am_pre_enable , + am_act_enable , + am_read_enable , + am_write_enable , + // + arb_pre_all , + arb_refr , + arb_pre , + arb_act , + arb_read , + arb_write , + arb_rowa , + arb_cola , + arb_ba , + arb_chid , + arb_burst + ); + + input wire clk ; + input wire reset; + input wire sclr ; + + //-------------------------------------------------------------------------------------------------- + // interface from sequence decoders + //-------------------------------------------------------------------------------------------------- + + input wire dec0_pre_all ; + input wire dec0_refr ; + input wire dec0_pre ; + input wire dec0_act ; + input wire dec0_read ; + input wire dec0_write ; + output logic dec0_pre_all_enable; + output logic dec0_refr_enable ; + output logic dec0_pre_enable ; + output logic dec0_act_enable ; + output logic dec0_read_enable ; + output logic dec0_write_enable ; + input wire dec0_locked ; + input wire dec0_last ; + input rowa_t dec0_rowa ; + input cola_t dec0_cola ; + input ba_t dec0_ba ; + input chid_t dec0_chid ; + input sdram_burst_t dec0_burst ; + // + input wire dec1_pre_all ; + input wire dec1_refr ; + input wire dec1_pre ; + input wire dec1_act ; + input wire dec1_read ; + input wire dec1_write ; + output logic dec1_pre_all_enable; + output logic dec1_refr_enable ; + output logic dec1_pre_enable ; + output logic dec1_act_enable ; + output logic dec1_read_enable ; + output logic dec1_write_enable ; + input wire dec1_locked ; + input wire dec1_last ; + input rowa_t dec1_rowa ; + input cola_t dec1_cola ; + input ba_t dec1_ba ; + input chid_t dec1_chid ; + input sdram_burst_t dec1_burst ; + // + input wire dec2_pre_all ; + input wire dec2_refr ; + input wire dec2_pre ; + input wire dec2_act ; + input wire dec2_read ; + input wire dec2_write ; + output logic dec2_pre_all_enable; + output logic dec2_refr_enable ; + output logic dec2_pre_enable ; + output logic dec2_act_enable ; + output logic dec2_read_enable ; + output logic dec2_write_enable ; + input wire dec2_locked ; + input wire dec2_last ; + input rowa_t dec2_rowa ; + input cola_t dec2_cola ; + input ba_t dec2_ba ; + input chid_t dec2_chid ; + input sdram_burst_t dec2_burst ; + + //-------------------------------------------------------------------------------------------------- + // interface from access manager + //-------------------------------------------------------------------------------------------------- + + input wire am_pre_all_enable ; + input wire am_refr_enable ; + input wire [0:3] am_pre_enable ; + input wire [0:3] am_act_enable ; + input wire [0:3] am_read_enable ; + input wire [0:3] am_write_enable ; + + //-------------------------------------------------------------------------------------------------- + // interface to multiplexer + //-------------------------------------------------------------------------------------------------- + + output logic arb_pre_all ; + output logic arb_refr ; + output logic arb_pre ; + output logic arb_act ; + output logic arb_read ; + output logic arb_write ; + output rowa_t arb_rowa ; + output cola_t arb_cola ; + output ba_t arb_ba ; + output chid_t arb_chid ; + output sdram_burst_t arb_burst ; + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + enum bit [1:0] {ARB0, ARB1, ARB2} arb, ba_rowa_mux; + + logic arb_ack; + + logic dec0_access_enable; + logic dec1_access_enable; + logic dec2_access_enable; + + logic dec0_bank_access_enable; + logic dec1_bank_access_enable; + logic dec2_bank_access_enable; + + logic dec1_can_have_access_when_arb_is_0 ; + logic dec2_can_have_access_when_arb_is_0 ; + + logic dec2_can_have_access_when_arb_is_1 ; + logic dec0_can_have_access_when_arb_is_1 ; + + logic dec0_can_have_access_when_arb_is_2 ; + logic dec1_can_have_access_when_arb_is_2 ; + + logic dec0_access_done; + logic dec1_access_done; + logic dec2_access_done; + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + always_ff @(posedge clk or posedge reset) begin : arbiter_logic + if (reset) + arb <= ARB0; + else if (sclr) + arb <= ARB0; + else if (arb_ack) + unique case (arb) + ARB0 : arb <= ARB1; + ARB1 : arb <= ARB2; + ARB2 : arb <= ARB0; + endcase + end + + // + // + // + `ifndef HSSDRC_NOT_SHARE_ACT_COMMAND + // use act command sharing + assign dec0_bank_access_enable = (dec0_pre & am_pre_enable [dec0_ba] ) | + (dec0_act & am_act_enable [dec0_ba] ) ; + + assign dec1_bank_access_enable = (dec1_pre & am_pre_enable [dec1_ba] ) | + (dec1_act & am_act_enable [dec1_ba] ) ; + + assign dec2_bank_access_enable = (dec2_pre & am_pre_enable [dec2_ba] ) | + (dec2_act & am_act_enable [dec2_ba] ) ; + `else + // not use act command sharing + assign dec0_bank_access_enable = (dec0_pre & am_pre_enable [dec0_ba] ) ; + + assign dec1_bank_access_enable = (dec1_pre & am_pre_enable [dec1_ba] ) ; + + assign dec2_bank_access_enable = (dec2_pre & am_pre_enable [dec2_ba] ) ; + `endif + // + // + // + assign dec0_access_enable = (dec0_read & am_read_enable [dec0_ba] ) | + (dec0_write & am_write_enable [dec0_ba] ) | + (dec0_pre & am_pre_enable [dec0_ba] ) | + (dec0_act & am_act_enable [dec0_ba] ) ; + + assign dec1_access_enable = (dec1_read & am_read_enable [dec1_ba] ) | + (dec1_write & am_write_enable [dec1_ba] ) | + (dec1_pre & am_pre_enable [dec1_ba] ) | + (dec1_act & am_act_enable [dec1_ba] ) ; + + + assign dec2_access_enable = (dec2_read & am_read_enable [dec2_ba] ) | + (dec2_write & am_write_enable [dec2_ba] ) | + (dec2_pre & am_pre_enable [dec2_ba] ) | + (dec2_act & am_act_enable [dec2_ba] ) ; + // + // + // + assign dec0_access_done = (dec0_refr & dec0_refr_enable) | + (dec0_last & + ((dec0_read & dec0_read_enable ) | + ( dec0_write & dec0_write_enable )) + ); + + assign dec1_access_done = (dec1_refr & dec1_refr_enable) | + (dec1_last & + ((dec1_read & dec1_read_enable ) | + ( dec1_write & dec1_write_enable )) + ); + + assign dec2_access_done = (dec2_refr & dec2_refr_enable) | + (dec2_last & + ((dec2_read & dec2_read_enable ) | + ( dec2_write & dec2_write_enable )) + ); + // + // + // + assign arb_ack = (dec0_access_done && (arb == ARB0)) | + (dec1_access_done && (arb == ARB1)) | + (dec2_access_done && (arb == ARB2)); + //-------------------------------------------------------------------------------------------------- + // decoder roundabout : dec0 -> dec1 -> dec2 -> dec0 -> dec1 + // + // arbiter for command pipeline need in folow comparators : + // 0 : dec0 - dec1 -> select dec1 + // : dec0 - dec2 & dec1 - dec2 -> select dec2 + // 1 : dec1 - dec2 -> select dec2 + // : dec1 - dec2 & dec2 - dec0 -> select dec0 + // 2 : dec2 - dec0 -> select dec0 + // : dec2 - dec1 & dec0 - dec1 -> select dec1 + // we can reclock it. becouse "ba" and "locked" is valid 1 tick before command + //-------------------------------------------------------------------------------------------------- + + always_ff @(posedge clk) begin : locked_and_bank_access_comparator + dec1_can_have_access_when_arb_is_0 <= ~dec0_locked & (dec1_ba != dec0_ba); + dec2_can_have_access_when_arb_is_0 <= ~dec0_locked & (dec2_ba != dec0_ba) & ~dec1_locked & (dec2_ba != dec1_ba); + + dec2_can_have_access_when_arb_is_1 <= ~dec1_locked & (dec2_ba != dec1_ba); + dec0_can_have_access_when_arb_is_1 <= ~dec1_locked & (dec0_ba != dec1_ba) & ~dec2_locked & (dec0_ba != dec2_ba); + + dec0_can_have_access_when_arb_is_2 <= ~dec2_locked & (dec0_ba != dec2_ba); + dec1_can_have_access_when_arb_is_2 <= ~dec2_locked & (dec1_ba != dec2_ba) & ~dec0_locked & (dec1_ba != dec0_ba); + end + + // + // + // + + always_comb begin : control_path_arbiter + + dec0_pre_all_enable = 1'b0; + dec0_refr_enable = 1'b0; + dec0_pre_enable = 1'b0; + dec0_act_enable = 1'b0; + dec0_read_enable = 1'b0; + dec0_write_enable = 1'b0; + + dec1_pre_all_enable = 1'b0; + dec1_refr_enable = 1'b0; + dec1_pre_enable = 1'b0; + dec1_act_enable = 1'b0; + dec1_read_enable = 1'b0; + dec1_write_enable = 1'b0; + + dec2_pre_all_enable = 1'b0; + dec2_refr_enable = 1'b0; + dec2_pre_enable = 1'b0; + dec2_act_enable = 1'b0; + dec2_read_enable = 1'b0; + dec2_write_enable = 1'b0; + + arb_pre_all = 1'b0; + arb_refr = 1'b0; + arb_pre = 1'b0; + arb_act = 1'b0; + arb_read = 1'b0; + arb_write = 1'b0; + + ba_rowa_mux = arb; + + unique case (arb) + ARB0 : begin : dec0_is_master + + dec0_pre_all_enable = am_pre_all_enable ; + dec0_refr_enable = am_refr_enable ; + dec0_pre_enable = am_pre_enable [dec0_ba]; + dec0_act_enable = am_act_enable [dec0_ba]; + dec0_read_enable = am_read_enable [dec0_ba]; + dec0_write_enable = am_write_enable [dec0_ba]; + + arb_pre_all = dec0_pre_all & dec0_pre_all_enable ; + arb_refr = dec0_refr & dec0_refr_enable ; + arb_pre = dec0_pre & dec0_pre_enable ; + arb_act = dec0_act & dec0_act_enable ; + arb_read = dec0_read & dec0_read_enable ; + arb_write = dec0_write & dec0_write_enable ; + +`ifndef HSSDRC_SHARE_NONE_DECODER + + if (~dec0_access_enable) begin + + if (dec1_can_have_access_when_arb_is_0) begin + + ba_rowa_mux = ARB1; + // + dec1_pre_enable = am_pre_enable [dec1_ba]; + + arb_pre = dec1_pre & dec1_pre_enable ; + // + `ifndef HSSDRC_NOT_SHARE_ACT_COMMAND + dec1_act_enable = am_act_enable [dec1_ba]; + + arb_act = dec1_act & dec1_act_enable ; + `endif + + end + + `ifndef HSSDRC_SHARE_ONE_DECODER + if (~dec1_bank_access_enable & dec2_can_have_access_when_arb_is_0) begin + `else + else if (dec2_can_have_access_when_arb_is_0) begin + `endif + ba_rowa_mux = ARB2; + // + dec2_pre_enable = am_pre_enable [dec2_ba]; + + arb_pre = dec2_pre & dec2_pre_enable ; + // + `ifndef HSSDRC_NOT_SHARE_ACT_COMMAND + dec2_act_enable = am_act_enable [dec2_ba]; + + arb_act = dec2_act & dec2_act_enable ; + `endif + + end + end +`endif // HSSDRC_SHARE_NONE_DECODER + end + + ARB1 : begin : dec1_is_master + + dec1_pre_all_enable = am_pre_all_enable ; + dec1_refr_enable = am_refr_enable ; + dec1_pre_enable = am_pre_enable [dec1_ba]; + dec1_act_enable = am_act_enable [dec1_ba]; + dec1_read_enable = am_read_enable [dec1_ba]; + dec1_write_enable = am_write_enable [dec1_ba]; + + arb_pre_all = dec1_pre_all & dec1_pre_all_enable ; + arb_refr = dec1_refr & dec1_refr_enable ; + arb_pre = dec1_pre & dec1_pre_enable ; + arb_act = dec1_act & dec1_act_enable ; + arb_read = dec1_read & dec1_read_enable ; + arb_write = dec1_write & dec1_write_enable ; + +`ifndef HSSDRC_SHARE_NONE_DECODER + + if (~dec1_access_enable) begin + + if (dec2_can_have_access_when_arb_is_1) begin + + ba_rowa_mux = ARB2; + // + dec2_pre_enable = am_pre_enable [dec2_ba]; + + arb_pre = dec2_pre & dec2_pre_enable ; + // + `ifndef HSSDRC_NOT_SHARE_ACT_COMMAND + dec2_act_enable = am_act_enable [dec2_ba]; + + arb_act = dec2_act & dec2_act_enable ; + `endif + + end + + `ifndef HSSDRC_SHARE_ONE_DECODER + if (~dec2_bank_access_enable & dec0_can_have_access_when_arb_is_1) begin + `else + else if (dec0_can_have_access_when_arb_is_1) begin + `endif + ba_rowa_mux = ARB0; + // + dec0_pre_enable = am_pre_enable [dec0_ba]; + + arb_pre = dec0_pre & dec0_pre_enable ; + // + `ifndef HSSDRC_NOT_SHARE_ACT_COMMAND + dec0_act_enable = am_act_enable [dec0_ba]; + + arb_act = dec0_act & dec0_act_enable ; + `endif + + end + end +`endif // HSSDRC_SHARE_NONE_DECODER + end + + ARB2 : begin : dec2_is_master + + dec2_pre_all_enable = am_pre_all_enable ; + dec2_refr_enable = am_refr_enable ; + dec2_pre_enable = am_pre_enable [dec2_ba] ; + dec2_act_enable = am_act_enable [dec2_ba] ; + dec2_read_enable = am_read_enable [dec2_ba] ; + dec2_write_enable = am_write_enable [dec2_ba] ; + + arb_pre_all = dec2_pre_all & dec2_pre_all_enable ; + arb_refr = dec2_refr & dec2_refr_enable ; + arb_pre = dec2_pre & dec2_pre_enable ; + arb_act = dec2_act & dec2_act_enable ; + arb_read = dec2_read & dec2_read_enable ; + arb_write = dec2_write & dec2_write_enable ; + +`ifndef HSSDRC_SHARE_NONE_DECODER + + if (~dec2_access_enable) begin + + if (dec0_can_have_access_when_arb_is_2) begin + + ba_rowa_mux = ARB0; + // + dec0_pre_enable = am_pre_enable [dec0_ba]; + + arb_pre = dec0_pre & dec0_pre_enable ; + // + `ifndef HSSDRC_NOT_SHARE_ACT_COMMAND + dec0_act_enable = am_act_enable [dec0_ba]; + + arb_act = dec0_act & dec0_act_enable ; + `endif + + end + + `ifndef HSSDRC_SHARE_ONE_DECODER + if (~dec0_bank_access_enable & dec1_can_have_access_when_arb_is_2) begin + `else + else if (dec1_can_have_access_when_arb_is_2) begin + `endif + ba_rowa_mux = ARB1; + // + dec1_pre_enable = am_pre_enable [dec1_ba]; + + arb_pre = dec1_pre & dec1_pre_enable ; + // + `ifndef HSSDRC_NOT_SHARE_ACT_COMMAND + dec1_act_enable = am_act_enable [dec1_ba]; + + arb_act = dec1_act & dec1_act_enable ; + `endif + + end + end +`endif // HSSDRC_SHARE_NONE_DECODER + end + endcase + end + + + + always_comb begin : mux_addr_path2arbiter + + // + // no complex mux : used in read/write command + // + + arb_cola = dec0_cola; + arb_chid = dec0_chid; + arb_burst = dec0_burst; + + unique case (arb) + ARB0 : begin + arb_cola = dec0_cola; + arb_chid = dec0_chid; + arb_burst = dec0_burst; + end + ARB1 : begin + arb_cola = dec1_cola; + arb_chid = dec1_chid; + arb_burst = dec1_burst; + end + ARB2 : begin + arb_cola = dec2_cola; + arb_chid = dec2_chid; + arb_burst = dec2_burst; + end + default : begin end + endcase + + // + // complex mux used in pre command + // + + arb_ba = dec0_ba; + + unique case (ba_rowa_mux) + ARB0 : arb_ba = dec0_ba; + ARB1 : arb_ba = dec1_ba; + ARB2 : arb_ba = dec2_ba; + endcase + + // + // complex mux used in act command + // + + arb_rowa = dec0_rowa; + +`ifndef HSSDRC_NOT_SHARE_ACT_COMMAND + unique case (ba_rowa_mux) +`else + unique case (arb) +`endif + ARB0 : arb_rowa = dec0_rowa; + ARB1 : arb_rowa = dec1_rowa; + ARB2 : arb_rowa = dec2_rowa; + endcase + + end + +endmodule
hssdrc/trunk/rtl/hssdrc_arbiter_out.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/rtl/hssdrc_ba_map.v =================================================================== --- hssdrc/trunk/rtl/hssdrc_ba_map.v (nonexistent) +++ hssdrc/trunk/rtl/hssdrc_ba_map.v (revision 3) @@ -0,0 +1,136 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:52:43 $ +// +// Workfile : hssdrc_ba_map.v +// +// Description : bank & row map unit +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + + +`include "hssdrc_timescale.vh" + +`include "hssdrc_define.vh" + +module hssdrc_ba_map ( + clk , + reset , + sclr , + // + update , + clear , + ba , + rowa , + // + pre_act_rw , + act_rw , + rw , + all_close + + ); + + input wire clk ; + input wire reset ; + input wire sclr ; + + //-------------------------------------------------------------------------------------------------- + // interface from sequence decoders + //-------------------------------------------------------------------------------------------------- + + input wire update ; + input wire clear ; + input ba_t ba ; + input rowa_t rowa ; + + //-------------------------------------------------------------------------------------------------- + // interface to sequence decoders + //-------------------------------------------------------------------------------------------------- + + output logic pre_act_rw ; + output logic act_rw ; + output logic rw ; + output logic all_close ; + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + logic [3:0] bank_open; + rowa_t row_open [0:3]; + wire bank_is_open; + wire row_is_open; + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + always_ff @(posedge clk or posedge reset) begin : bank_open_map_process + if (reset) + bank_open <= '0; + else if (sclr) + bank_open <= '0; + else begin + if (clear) + bank_open <= '0; + else if (update) + bank_open [ba] <= 1'b1; + else begin + end + end + end + + // + // + // + + always_ff @(posedge clk) begin : row_open_map_process + if (update) + row_open[ba] <= rowa; + end + + // + // + // + + assign bank_is_open = bank_open [ba]; + assign row_is_open = (row_open [ba] == rowa); + + // + // + // + + assign rw = bank_is_open & row_is_open; + assign pre_act_rw = bank_is_open & ~row_is_open; + assign act_rw = ~bank_is_open; + assign all_close = (bank_open == 0); + +endmodule
hssdrc/trunk/rtl/hssdrc_ba_map.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/rtl/hssdrc_top.v =================================================================== --- hssdrc/trunk/rtl/hssdrc_top.v (nonexistent) +++ hssdrc/trunk/rtl/hssdrc_top.v (revision 3) @@ -0,0 +1,758 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:52:43 $ +// +// Workfile : hssdrc_top.v +// +// Description : top level of memory controller +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +`include "hssdrc_timescale.vh" + +`include "hssdrc_define.vh" + +module hssdrc_top ( + clk , + reset , + sclr , + sys_write , + sys_read , + sys_refr , + sys_rowa , + sys_cola , + sys_ba , + sys_burst , + sys_chid_i , + sys_wdata , + sys_wdatam , + sys_ready , + sys_use_wdata , + sys_vld_rdata , + sys_chid_o , + sys_rdata , + dq , + dqm , + addr , + ba , + cke , + cs_n , + ras_n , + cas_n , + we_n + ); + + input wire clk ; + input wire reset; + input wire sclr ; + + //-------------------------------------------------------------------------------------------------- + // system interface + //-------------------------------------------------------------------------------------------------- + + input wire sys_write ; + input wire sys_read ; + input wire sys_refr ; + input rowa_t sys_rowa ; + input cola_t sys_cola ; + input ba_t sys_ba ; + input burst_t sys_burst ; + input chid_t sys_chid_i ; + input data_t sys_wdata ; + input datam_t sys_wdatam ; + + output logic sys_ready ; + output logic sys_use_wdata ; + output logic sys_vld_rdata ; + output chid_t sys_chid_o ; + output data_t sys_rdata ; + + //-------------------------------------------------------------------------------------------------- + // sdram interface + //-------------------------------------------------------------------------------------------------- + + inout wire [pDataBits-1:0] dq; + output datam_t dqm; + output sdram_addr_t addr; + output ba_t ba; + output logic cke; + output logic cs_n; + output logic ras_n; + output logic cas_n; + output logic we_n; + + //-------------------------------------------------------------------------------------------------- + // internal signals + //-------------------------------------------------------------------------------------------------- + + wire init_done; + wire hssdrc_sclr; + + //-------------------------------------------------------------------------------------------------- + // refr_cnt <-> arbiter_in + //-------------------------------------------------------------------------------------------------- + + wire refr_cnt___ack ; + wire refr_cnt___hi_req ; + wire refr_cnt___low_req ; + + //-------------------------------------------------------------------------------------------------- + // arbiter_in <-> decoder's + //-------------------------------------------------------------------------------------------------- + + wire arbiter_in0___write ; + wire arbiter_in0___read ; + wire arbiter_in0___refr ; + rowa_t arbiter_in0___rowa ; + cola_t arbiter_in0___cola ; + ba_t arbiter_in0___ba ; + burst_t arbiter_in0___burst ; + chid_t arbiter_in0___chid ; + wire arbiter_in0___ready ; + // + wire arbiter_in1___write ; + wire arbiter_in1___read ; + wire arbiter_in1___refr ; + rowa_t arbiter_in1___rowa ; + cola_t arbiter_in1___cola ; + ba_t arbiter_in1___ba ; + burst_t arbiter_in1___burst ; + chid_t arbiter_in1___chid ; + wire arbiter_in1___ready ; + // + wire arbiter_in2___write ; + wire arbiter_in2___read ; + wire arbiter_in2___refr ; + rowa_t arbiter_in2___rowa ; + cola_t arbiter_in2___cola ; + ba_t arbiter_in2___ba ; + burst_t arbiter_in2___burst ; + chid_t arbiter_in2___chid ; + wire arbiter_in2___ready ; + + //-------------------------------------------------------------------------------------------------- + // ba_map <-> decoder's + //-------------------------------------------------------------------------------------------------- + + wire ba_map___update ; + wire ba_map___clear ; + ba_t ba_map___ba ; + rowa_t ba_map___rowa ; + wire ba_map___pre_act_rw ; + wire ba_map___act_rw ; + wire ba_map___rw ; + wire ba_map___all_close ; + + //-------------------------------------------------------------------------------------------------- + // decoder's <-> arbiter_out + //-------------------------------------------------------------------------------------------------- + + wire dec0___pre_all ; + wire dec0___refr ; + wire dec0___pre ; + wire dec0___act ; + wire dec0___read ; + wire dec0___write ; + wire dec0___pre_all_enable ; + wire dec0___refr_enable ; + wire dec0___pre_enable ; + wire dec0___act_enable ; + wire dec0___read_enable ; + wire dec0___write_enable ; + wire dec0___locked ; + wire dec0___last ; + rowa_t dec0___rowa ; + cola_t dec0___cola ; + ba_t dec0___ba ; + chid_t dec0___chid ; + sdram_burst_t dec0___burst ; + // + wire dec1___pre_all ; + wire dec1___refr ; + wire dec1___pre ; + wire dec1___act ; + wire dec1___read ; + wire dec1___write ; + wire dec1___pre_all_enable ; + wire dec1___refr_enable ; + wire dec1___pre_enable ; + wire dec1___act_enable ; + wire dec1___read_enable ; + wire dec1___write_enable ; + wire dec1___locked ; + wire dec1___last ; + rowa_t dec1___rowa ; + cola_t dec1___cola ; + ba_t dec1___ba ; + chid_t dec1___chid ; + sdram_burst_t dec1___burst ; + // + wire dec2___pre_all ; + wire dec2___refr ; + wire dec2___pre ; + wire dec2___act ; + wire dec2___read ; + wire dec2___write ; + wire dec2___pre_all_enable ; + wire dec2___refr_enable ; + wire dec2___pre_enable ; + wire dec2___act_enable ; + wire dec2___read_enable ; + wire dec2___write_enable ; + wire dec2___locked ; + wire dec2___last ; + rowa_t dec2___rowa ; + cola_t dec2___cola ; + ba_t dec2___ba ; + chid_t dec2___chid ; + sdram_burst_t dec2___burst ; + + //-------------------------------------------------------------------------------------------------- + // access_manager -> arbiter_out + //-------------------------------------------------------------------------------------------------- + + wire access_manager___pre_all_enable ; + wire access_manager___refr_enable ; + wire [0:3] access_manager___pre_enable ; + wire [0:3] access_manager___act_enable ; + wire [0:3] access_manager___read_enable ; + wire [0:3] access_manager___write_enable ; + + //-------------------------------------------------------------------------------------------------- + // arbiter_out -> multiplexer/access_manager + //-------------------------------------------------------------------------------------------------- + + wire arbiter_out___pre_all ; + wire arbiter_out___refr ; + wire arbiter_out___pre ; + wire arbiter_out___act ; + wire arbiter_out___read ; + wire arbiter_out___write ; + rowa_t arbiter_out___rowa ; + cola_t arbiter_out___cola ; + ba_t arbiter_out___ba ; + chid_t arbiter_out___chid ; + sdram_burst_t arbiter_out___burst ; + + //-------------------------------------------------------------------------------------------------- + // init_state -> multiplexer + //-------------------------------------------------------------------------------------------------- + + wire init_state___pre_all ; + wire init_state___refr ; + wire init_state___lmr ; + rowa_t init_state___rowa ; + + //-------------------------------------------------------------------------------------------------- + // multiplexer -> sdram_addr_path/sdram_data_path + //-------------------------------------------------------------------------------------------------- + + wire mux___pre_all ; + wire mux___refr ; + wire mux___pre ; + wire mux___act ; + wire mux___read ; + wire mux___write ; + wire mux___lmr ; + rowa_t mux___rowa ; + cola_t mux___cola ; + ba_t mux___ba ; + chid_t mux___chid ; + sdram_burst_t mux___burst ; + + // + // this clear use to disable fsm that must be off when sdram chip is not configured + // + + assign hssdrc_sclr = sclr | ~init_done; + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + hssdrc_refr_counter refr_cnt( + .clk (clk ), + .reset (reset), + .sclr (hssdrc_sclr ), // use internal sclr becouse there is refresh "fsm" + .ack (refr_cnt___ack ), + .hi_req (refr_cnt___hi_req ), + .low_req (refr_cnt___low_req) + ); + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + hssdrc_arbiter_in arbiter_in ( + .clk (clk ), + .reset (reset), + .sclr (hssdrc_sclr ), // use internal sclr becouse there is arbiter fsm + // + .sys_write (sys_write ) , + .sys_read (sys_read ) , + .sys_refr (sys_refr ) , + .sys_rowa (sys_rowa ) , + .sys_cola (sys_cola ) , + .sys_ba (sys_ba ) , + .sys_burst (sys_burst ) , + .sys_chid_i (sys_chid_i) , + .sys_ready (sys_ready ) , + // + .refr_cnt_ack (refr_cnt___ack ), + .refr_cnt_hi_req (refr_cnt___hi_req ), + .refr_cnt_low_req (refr_cnt___low_req), + // + .dec0_write (arbiter_in0___write), + .dec0_read (arbiter_in0___read ), + .dec0_refr (arbiter_in0___refr ), + .dec0_rowa (arbiter_in0___rowa ), + .dec0_cola (arbiter_in0___cola ), + .dec0_ba (arbiter_in0___ba ), + .dec0_burst (arbiter_in0___burst), + .dec0_chid (arbiter_in0___chid ), + .dec0_ready (arbiter_in0___ready), + // + .dec1_write (arbiter_in1___write), + .dec1_read (arbiter_in1___read ), + .dec1_refr (arbiter_in1___refr ), + .dec1_rowa (arbiter_in1___rowa ), + .dec1_cola (arbiter_in1___cola ), + .dec1_ba (arbiter_in1___ba ), + .dec1_burst (arbiter_in1___burst), + .dec1_chid (arbiter_in1___chid ), + .dec1_ready (arbiter_in1___ready), + // + .dec2_write (arbiter_in2___write), + .dec2_read (arbiter_in2___read ), + .dec2_refr (arbiter_in2___refr ), + .dec2_rowa (arbiter_in2___rowa ), + .dec2_cola (arbiter_in2___cola ), + .dec2_ba (arbiter_in2___ba ), + .dec2_burst (arbiter_in2___burst), + .dec2_chid (arbiter_in2___chid ), + .dec2_ready (arbiter_in2___ready) + ); + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + hssdrc_ba_map ba_map ( + .clk (clk ), + .reset (reset), + .sclr (hssdrc_sclr), // use internal sclr becouse there is bank access map + // + .update (ba_map___update), + .clear (ba_map___clear ), + .ba (ba_map___ba ), + .rowa (ba_map___rowa ), + // + .pre_act_rw (ba_map___pre_act_rw), + .act_rw (ba_map___act_rw ), + .rw (ba_map___rw ), + .all_close (ba_map___all_close ) + ); + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + hssdrc_decoder decoder ( + .clk (clk ), + .reset (reset), + .sclr (hssdrc_sclr), // use internal sclr becouse there is decoders fsm + // + .ba_map_update (ba_map___update ), + .ba_map_clear (ba_map___clear ), + .ba_map_ba (ba_map___ba ), + .ba_map_rowa (ba_map___rowa ), + // + .ba_map_pre_act_rw (ba_map___pre_act_rw), + .ba_map_act_rw (ba_map___act_rw ), + .ba_map_rw (ba_map___rw ), + .ba_map_all_close (ba_map___all_close ), + // + .arb0_write (arbiter_in0___write), + .arb0_read (arbiter_in0___read ), + .arb0_refr (arbiter_in0___refr ), + .arb0_rowa (arbiter_in0___rowa ), + .arb0_cola (arbiter_in0___cola ), + .arb0_ba (arbiter_in0___ba ), + .arb0_burst (arbiter_in0___burst), + .arb0_chid (arbiter_in0___chid ), + .arb0_ready (arbiter_in0___ready), + // + .arb1_write (arbiter_in1___write), + .arb1_read (arbiter_in1___read ), + .arb1_refr (arbiter_in1___refr ), + .arb1_rowa (arbiter_in1___rowa ), + .arb1_cola (arbiter_in1___cola ), + .arb1_ba (arbiter_in1___ba ), + .arb1_burst (arbiter_in1___burst), + .arb1_chid (arbiter_in1___chid ), + .arb1_ready (arbiter_in1___ready), + // + .arb2_write (arbiter_in2___write), + .arb2_read (arbiter_in2___read ), + .arb2_refr (arbiter_in2___refr ), + .arb2_rowa (arbiter_in2___rowa ), + .arb2_cola (arbiter_in2___cola ), + .arb2_ba (arbiter_in2___ba ), + .arb2_burst (arbiter_in2___burst), + .arb2_chid (arbiter_in2___chid ), + .arb2_ready (arbiter_in2___ready), + // + .dec0_pre_all (dec0___pre_all ), + .dec0_refr (dec0___refr ), + .dec0_pre (dec0___pre ), + .dec0_act (dec0___act ), + .dec0_read (dec0___read ), + .dec0_write (dec0___write ), + .dec0_pre_all_enable(dec0___pre_all_enable), + .dec0_refr_enable (dec0___refr_enable ), + .dec0_pre_enable (dec0___pre_enable ), + .dec0_act_enable (dec0___act_enable ), + .dec0_read_enable (dec0___read_enable ), + .dec0_write_enable (dec0___write_enable ), + .dec0_locked (dec0___locked ), + .dec0_last (dec0___last ), + .dec0_rowa (dec0___rowa ), + .dec0_cola (dec0___cola ), + .dec0_ba (dec0___ba ), + .dec0_chid (dec0___chid ), + .dec0_burst (dec0___burst ), + // + .dec1_pre_all (dec1___pre_all ), + .dec1_refr (dec1___refr ), + .dec1_pre (dec1___pre ), + .dec1_act (dec1___act ), + .dec1_read (dec1___read ), + .dec1_write (dec1___write ), + .dec1_pre_all_enable(dec1___pre_all_enable), + .dec1_refr_enable (dec1___refr_enable ), + .dec1_pre_enable (dec1___pre_enable ), + .dec1_act_enable (dec1___act_enable ), + .dec1_read_enable (dec1___read_enable ), + .dec1_write_enable (dec1___write_enable ), + .dec1_locked (dec1___locked ), + .dec1_last (dec1___last ), + .dec1_rowa (dec1___rowa ), + .dec1_cola (dec1___cola ), + .dec1_ba (dec1___ba ), + .dec1_chid (dec1___chid ), + .dec1_burst (dec1___burst ), + // + .dec2_pre_all (dec2___pre_all ), + .dec2_refr (dec2___refr ), + .dec2_pre (dec2___pre ), + .dec2_act (dec2___act ), + .dec2_read (dec2___read ), + .dec2_write (dec2___write ), + .dec2_pre_all_enable(dec2___pre_all_enable), + .dec2_refr_enable (dec2___refr_enable ), + .dec2_pre_enable (dec2___pre_enable ), + .dec2_act_enable (dec2___act_enable ), + .dec2_read_enable (dec2___read_enable ), + .dec2_write_enable (dec2___write_enable ), + .dec2_locked (dec2___locked ), + .dec2_last (dec2___last ), + .dec2_rowa (dec2___rowa ), + .dec2_cola (dec2___cola ), + .dec2_ba (dec2___ba ), + .dec2_chid (dec2___chid ), + .dec2_burst (dec2___burst ) + ); + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + hssdrc_arbiter_out arbiter_out( + .clk (clk), + .reset (reset), + .sclr (hssdrc_sclr), // use internal sclr becouse there is arbiter fsm + // + .dec0_pre_all (dec0___pre_all ), + .dec0_refr (dec0___refr ), + .dec0_pre (dec0___pre ), + .dec0_act (dec0___act ), + .dec0_read (dec0___read ), + .dec0_write (dec0___write ), + .dec0_pre_all_enable(dec0___pre_all_enable), + .dec0_refr_enable (dec0___refr_enable ), + .dec0_pre_enable (dec0___pre_enable ), + .dec0_act_enable (dec0___act_enable ), + .dec0_read_enable (dec0___read_enable ), + .dec0_write_enable (dec0___write_enable ), + .dec0_locked (dec0___locked ), + .dec0_last (dec0___last ), + .dec0_rowa (dec0___rowa ), + .dec0_cola (dec0___cola ), + .dec0_ba (dec0___ba ), + .dec0_chid (dec0___chid ), + .dec0_burst (dec0___burst ), + // + .dec1_pre_all (dec1___pre_all ), + .dec1_refr (dec1___refr ), + .dec1_pre (dec1___pre ), + .dec1_act (dec1___act ), + .dec1_read (dec1___read ), + .dec1_write (dec1___write ), + .dec1_pre_all_enable(dec1___pre_all_enable), + .dec1_refr_enable (dec1___refr_enable ), + .dec1_pre_enable (dec1___pre_enable ), + .dec1_act_enable (dec1___act_enable ), + .dec1_read_enable (dec1___read_enable ), + .dec1_write_enable (dec1___write_enable ), + .dec1_locked (dec1___locked ), + .dec1_last (dec1___last ), + .dec1_rowa (dec1___rowa ), + .dec1_cola (dec1___cola ), + .dec1_ba (dec1___ba ), + .dec1_chid (dec1___chid ), + .dec1_burst (dec1___burst ), + // + .dec2_pre_all (dec2___pre_all ), + .dec2_refr (dec2___refr ), + .dec2_pre (dec2___pre ), + .dec2_act (dec2___act ), + .dec2_read (dec2___read ), + .dec2_write (dec2___write ), + .dec2_pre_all_enable(dec2___pre_all_enable), + .dec2_refr_enable (dec2___refr_enable ), + .dec2_pre_enable (dec2___pre_enable ), + .dec2_act_enable (dec2___act_enable ), + .dec2_read_enable (dec2___read_enable ), + .dec2_write_enable (dec2___write_enable ), + .dec2_locked (dec2___locked ), + .dec2_last (dec2___last ), + .dec2_rowa (dec2___rowa ), + .dec2_cola (dec2___cola ), + .dec2_ba (dec2___ba ), + .dec2_chid (dec2___chid ), + .dec2_burst (dec2___burst ), + // + .am_pre_all_enable (access_manager___pre_all_enable), + .am_refr_enable (access_manager___refr_enable ), + .am_pre_enable (access_manager___pre_enable ), + .am_act_enable (access_manager___act_enable ), + .am_read_enable (access_manager___read_enable ), + .am_write_enable (access_manager___write_enable ), + // + .arb_pre_all (arbiter_out___pre_all), + .arb_refr (arbiter_out___refr ), + .arb_pre (arbiter_out___pre ), + .arb_act (arbiter_out___act ), + .arb_read (arbiter_out___read ), + .arb_write (arbiter_out___write ), + .arb_rowa (arbiter_out___rowa ), + .arb_cola (arbiter_out___cola ), + .arb_ba (arbiter_out___ba ), + .arb_chid (arbiter_out___chid ), + .arb_burst (arbiter_out___burst ) + ); + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + hssdrc_access_manager access_manager ( + .clk (clk ), + .reset (reset), + .sclr (hssdrc_sclr), // use internal sclr becouse there is access "fsm's" + // + .arb_pre_all (arbiter_out___pre_all), + .arb_refr (arbiter_out___refr ), + .arb_pre (arbiter_out___pre ), + .arb_act (arbiter_out___act ), + .arb_read (arbiter_out___read ), + .arb_write (arbiter_out___write ), + .arb_ba (arbiter_out___ba ), + .arb_burst (arbiter_out___burst ), + // + .am_pre_all_enable (access_manager___pre_all_enable), + .am_refr_enable (access_manager___refr_enable ), + .am_pre_enable (access_manager___pre_enable ), + .am_act_enable (access_manager___act_enable ), + .am_read_enable (access_manager___read_enable ), + .am_write_enable (access_manager___write_enable ) + ); + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + hssdrc_init_state init_state( + .clk (clk ), + .reset (reset), + .sclr (sclr ), // use external sclr becouse this is initial start fsm + .init_done (init_done), + .pre_all (init_state___pre_all), + .refr (init_state___refr ), + .lmr (init_state___lmr ), + .rowa (init_state___rowa ) + ); + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + hssdrc_mux mux ( + .init_done (init_done), + // + .init_state_pre_all (init_state___pre_all), + .init_state_refr (init_state___refr ), + .init_state_lmr (init_state___lmr ), + .init_state_rowa (init_state___rowa ), + // + .arb_pre_all (arbiter_out___pre_all), + .arb_refr (arbiter_out___refr ), + .arb_pre (arbiter_out___pre ), + .arb_act (arbiter_out___act ), + .arb_read (arbiter_out___read ), + .arb_write (arbiter_out___write ), + .arb_rowa (arbiter_out___rowa ), + .arb_cola (arbiter_out___cola ), + .arb_ba (arbiter_out___ba ), + .arb_chid (arbiter_out___chid ), + .arb_burst (arbiter_out___burst ), + // + .mux_pre_all (mux___pre_all), + .mux_refr (mux___refr ), + .mux_pre (mux___pre ), + .mux_act (mux___act ), + .mux_read (mux___read ), + .mux_write (mux___write ), + .mux_lmr (mux___lmr ), + .mux_rowa (mux___rowa ), + .mux_cola (mux___cola ), + .mux_ba (mux___ba ), + .mux_chid (mux___chid ), + .mux_burst (mux___burst ) + ); + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + `ifndef HSSDRC_DQ_PIPELINE + + hssdrc_data_path data_path ( + .clk (clk ), + .reset (reset), + .sclr (sclr ), // use external sclr becouse there is no any fsm + // + .sys_wdata (sys_wdata ), + .sys_wdatam (sys_wdatam ), + .sys_use_wdata (sys_use_wdata), + .sys_vld_rdata (sys_vld_rdata), + .sys_chid_o (sys_chid_o ), + .sys_rdata (sys_rdata ), + // + .arb_read (mux___read ), + .arb_write (mux___write ), + .arb_chid (mux___chid ), + .arb_burst (mux___burst ), + // + .dq (dq ), + .dqm (dqm ) + ); + + `else + + hssdrc_data_path_p1 data_path_p1 ( + .clk (clk ), + .reset (reset), + .sclr (sclr ), // use external sclr becouse there is no any fsm + // + .sys_wdata (sys_wdata ), + .sys_wdatam (sys_wdatam ), + .sys_use_wdata (sys_use_wdata), + .sys_vld_rdata (sys_vld_rdata), + .sys_chid_o (sys_chid_o ), + .sys_rdata (sys_rdata ), + // + .arb_read (mux___read ), + .arb_write (mux___write ), + .arb_chid (mux___chid ), + .arb_burst (mux___burst ), + // + .dq (dq ), + .dqm (dqm ) + ); + + `endif + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + `ifndef HSSDRC_DQ_PIPELINE + + hssdrc_addr_path addr_path( + .clk (clk ), + .reset (reset), + .sclr (sclr ), // use external sclr becouse there is no any fsm + // + .arb_pre_all (mux___pre_all), + .arb_refr (mux___refr ), + .arb_pre (mux___pre ), + .arb_act (mux___act ), + .arb_read (mux___read ), + .arb_write (mux___write ), + .arb_lmr (mux___lmr ), + .arb_rowa (mux___rowa ), + .arb_cola (mux___cola ), + .arb_ba (mux___ba ), + // + .addr (addr ), + .ba (ba ), + .cke (cke ), + .cs_n (cs_n ), + .ras_n (ras_n), + .cas_n (cas_n), + .we_n (we_n ) + ); + + `else + + hssdrc_addr_path_p1 addr_path_p1( + .clk (clk ), + .reset (reset), + .sclr (sclr ), // use external sclr becouse there is no any fsm + // + .arb_pre_all (mux___pre_all), + .arb_refr (mux___refr ), + .arb_pre (mux___pre ), + .arb_act (mux___act ), + .arb_read (mux___read ), + .arb_write (mux___write ), + .arb_lmr (mux___lmr ), + .arb_rowa (mux___rowa ), + .arb_cola (mux___cola ), + .arb_ba (mux___ba ), + // + .addr (addr ), + .ba (ba ), + .cke (cke ), + .cs_n (cs_n ), + .ras_n (ras_n), + .cas_n (cas_n), + .we_n (we_n ) + ); + + `endif + +endmodule + +
hssdrc/trunk/rtl/hssdrc_top.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/rtl/hssdrc_init_state.v =================================================================== --- hssdrc/trunk/rtl/hssdrc_init_state.v (nonexistent) +++ hssdrc/trunk/rtl/hssdrc_init_state.v (revision 3) @@ -0,0 +1,154 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:52:43 $ +// +// Workfile : hssdrc_init_state.v +// +// Description : sdram chip initialization unit +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +`include "hssdrc_timescale.vh" + +`include "hssdrc_timing.vh" +`include "hssdrc_define.vh" + +module hssdrc_init_state ( + clk , + reset , + sclr , + init_done , + pre_all , + refr , + lmr , + rowa + ); + + input wire clk ; + input wire reset; + input wire sclr ; + + output logic init_done; + output logic pre_all ; + output logic refr ; + output logic lmr ; + output rowa_t rowa ; + + assign rowa = cInitLmrValue; + + //--------------------------------------------------------------------------------------------------- + // counter based FSM + // fsm has 1 counter divided by 2 part : + // cnt_high - decode for wait init interval + // cnt_low - execute command sequence when wait done. + // true init time is ~= (1.1 - 1.2) pInit_time for less logic resource using + //--------------------------------------------------------------------------------------------------- + + localparam int unsigned cInitPre = 1; + localparam int unsigned cInitRefr0 = cInitPre + cTrp; + localparam int unsigned cInitRefr1 = cInitRefr0 + cTrfc; + localparam int unsigned cInitLmr = cInitRefr1 + cTrfc; + localparam int unsigned cInitDone = cInitLmr + cTmrd + 1; + + // + // counter parameters + // + + localparam int unsigned cInitCntLowWidth = clogb2(cInitDone); + localparam int unsigned cInitCntHighMax = (cInitTime >> cInitCntLowWidth) + 1; + localparam int unsigned cInitCntWidth = clogb2(cInitCntHighMax) + cInitCntLowWidth; + + //-------------------------------------------------------------------------------------------------- + // + //-------------------------------------------------------------------------------------------------- + + logic [cInitCntWidth-1 : 0] cnt; + logic [cInitCntLowWidth-1 : 0] cnt_low; + logic [cInitCntWidth-1 : cInitCntLowWidth] cnt_high; + + logic cnt_high_is_max; + + assign cnt_low = cnt [cInitCntLowWidth-1 : 0]; + assign cnt_high = cnt [cInitCntWidth-1 : cInitCntLowWidth]; + + + always_ff @(posedge clk or posedge reset) begin : cnt_fsm + if (reset) + cnt <= '0; + else if (sclr) + cnt <= '0; + else if (~init_done) + cnt <= cnt + 1'b1; + end + + + always_ff @(posedge clk or posedge reset) begin : cnt_fsm_comparator + if (reset) + cnt_high_is_max <= 1'b0; + else if (sclr) + cnt_high_is_max <= 1'b0; + else + cnt_high_is_max <= (cnt_high == cInitCntHighMax); + end + + + always_ff @(posedge clk or posedge reset) begin : cnt_fsm_decode + if (reset) begin + init_done <= 1'b0; + pre_all <= 1'b0; + refr <= 1'b0; + lmr <= 1'b0; + end + else if (sclr) begin + init_done <= 1'b0; + pre_all <= 1'b0; + refr <= 1'b0; + lmr <= 1'b0; + end + else begin + + pre_all <= 1'b0; + refr <= 1'b0; + lmr <= 1'b0; + + unique case (cnt_low) + cInitPre : pre_all <= cnt_high_is_max; + cInitRefr0 : refr <= cnt_high_is_max; + cInitRefr1 : refr <= cnt_high_is_max; + cInitLmr : lmr <= cnt_high_is_max; + cInitDone : init_done <= cnt_high_is_max; + default : begin end + endcase + + end + end + +endmodule
hssdrc/trunk/rtl/hssdrc_init_state.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/include/hssdrc_tb_sys_if.vh =================================================================== --- hssdrc/trunk/include/hssdrc_tb_sys_if.vh (nonexistent) +++ hssdrc/trunk/include/hssdrc_tb_sys_if.vh (revision 3) @@ -0,0 +1,99 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:51:55 $ +// +// Workfile : hssdrc_tb_sys_if.vh +// +// Description : system interface to memory controller +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +`include "hssdrc_define.vh" + +`ifndef __HSSDRC_TB_SYS_IF_VH__ + + `define __HSSDRC_TB_SYS_IF_VH__ + + interface hssdrc_tb_sys_if (clk, reset, sclr); + input wire clk ; + input wire reset; + input wire sclr ; + // + logic write; + logic read; + logic refr; + rowa_t rowa; + cola_t cola; + ba_t ba; + burst_t burst; + chid_t chid_i; + data_t wdata; + datam_t wdatam; + // + logic ready; + logic use_wdata; + logic vld_rdata; + chid_t chid_o; + data_t rdata; + // + modport master ( output rowa, cola, ba, burst, chid_i, write, read, refr, wdata, wdatam, + input ready, use_wdata, vld_rdata, chid_o, rdata); + modport slave ( input rowa, cola, ba, burst, chid_i, write, read, refr, wdata, wdatam, + output ready, use_wdata, vld_rdata, chid_o, rdata); + // synthesis translate_off + clocking cb @(posedge clk); + default input #1ns output #1ns; + output rowa, cola, ba, burst, chid_i, write, read, refr, wdata, wdatam; + input ready, use_wdata, vld_rdata, chid_o, rdata; + endclocking + // + modport tb (input clk, reset, sclr, clocking cb); + // + wire [2:0] cmd_vect = {write, read, refr}; + wire sys_reset = reset | sclr; + // + property cmd_onehot; + @(cb) disable iff (sys_reset) (cmd_vect != 0) |-> $onehot(cmd_vect); + endproperty + // + property rst_output(logic signal); + @(cb) (sys_reset) |-> not (signal); + endproperty + // + assert property (cmd_onehot) else $error ("command overlaped violation error"); + assert property (rst_output(ready)) else $error ("hssdc reaady output reset violation error"); + assert property (rst_output(use_wdata)) else $error ("hssdc use_wdata output reset violation error"); + assert property (rst_output(vld_rdata)) else $error ("hssdc vld_rdata output reset violation error"); + // synthesis translate_on + + endinterface + +`endif
hssdrc/trunk/include/hssdrc_tb_sys_if.vh Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/include/hssdrc_timescale.vh =================================================================== --- hssdrc/trunk/include/hssdrc_timescale.vh (nonexistent) +++ hssdrc/trunk/include/hssdrc_timescale.vh (revision 3) @@ -0,0 +1,44 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:51:55 $ +// +// Workfile : hssdrc_timescale.vh +// +// Description : simulation time settings +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +// synthesis translate_off + + timeunit 1ns; + timeprecision 10ps; + +// synthesis translate_on
hssdrc/trunk/include/hssdrc_timescale.vh Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/include/hssdrc_timing.vh =================================================================== --- hssdrc/trunk/include/hssdrc_timing.vh (nonexistent) +++ hssdrc/trunk/include/hssdrc_timing.vh (revision 3) @@ -0,0 +1,93 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:51:55 $ +// +// Workfile : hssdrc_timing.vh +// +// Description : controller sdram timing paramters +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +`ifndef __HSSDRC_TIMING_VH__ + + `define __HSSDRC_TIMING_VH__ + + //`define HSSDRC_SIMULATE_TIMING // uncomment for easy debug arefr sequence + + //------------------------------------------------- + // sdram controller clock settings in MHz + //------------------------------------------------- + parameter real pClkMHz = 133.0; + //------------------------------------------------- + // sdram chip timing paramters in "ns" for -6 CL3 + //------------------------------------------------- + parameter real pTras_time = 42.0; // act a -> prech a + parameter real pTrfc_time = 60.0; // refr -> !nop + parameter real pTrc_time = 60.0; // act a -> act a (Tras + Trcd) + parameter real pTrcd_time = 18.0; // act a -> write/read a + parameter real pTrp_time = 18.0; // prech a -> !nop + parameter real pTrrd_time = 12.0; // act a -> act b + parameter real pTwr_time = 12.0; // write a -> prech a + + `ifndef HSSDRC_SIMULATE_TIMING + parameter real pRefr_time = 15625.0; // refr -> refr + parameter real pInit_time = 100000.0; // power up -> refr + `else + parameter real pRefr_time = 500.0; // simulate only refr -> refr + parameter real pInit_time = 500.0; // simulate only power up -> refr + `endif + //------------------------------------------------- + // sdram chip normalaize to clock parameters + //------------------------------------------------- + parameter int cTras = 0.5 + (pTras_time * pClkMHz)/1000.0; // act a -> prech a + parameter int cTrfc = 0.5 + (pTrfc_time * pClkMHz)/1000.0; // refr -> !nop + parameter int cTrc = 0.5 + ( pTrc_time * pClkMHz)/1000.0; // act a -> act a + parameter int cTrcd = 0.5 + (pTrcd_time * pClkMHz)/1000.0; // act a -> write/read a + parameter int cTrp = 0.5 + ( pTrp_time * pClkMHz)/1000.0; // prech a -> !nop + parameter int cTrrd = 0.5 + (pTrrd_time * pClkMHz)/1000.0; // act a -> act b + parameter int cTwr = 0.5 + ( pTwr_time * pClkMHz)/1000.0; // write a -> prech a + parameter int cTmrd = 2; // lmr -> !nop (not used) + parameter int cInitTime = 0.5 + (pInit_time * pClkMHz)/1000.0; + //------------------------------------------------- + // refresh parameters + //------------------------------------------------- + parameter real pRefrWindowLowPriority = 0.85; + parameter real pRefrWindowHighPriority = 0.95; + parameter int cRefCounterMaxTime = 0.5 + (pRefr_time * pClkMHz)/1000.0; + parameter int cRefrWindowLowPriorityTime = 0.5 + (pRefrWindowLowPriority * pRefr_time * pClkMHz)/1000.0; + parameter int cRefrWindowHighPriorityTime = 0.5 + (pRefrWindowHighPriority * pRefr_time * pClkMHz)/1000.0; + //------------------------------------------------- + // sdram controller use 0/1 cycle bus turnaround + //------------------------------------------------- + parameter int pBTA = 1; // set 0 if not need + + // +`endif
hssdrc/trunk/include/hssdrc_timing.vh Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/include/hssdrc_define.vh =================================================================== --- hssdrc/trunk/include/hssdrc_define.vh (nonexistent) +++ hssdrc/trunk/include/hssdrc_define.vh (revision 3) @@ -0,0 +1,139 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:51:55 $ +// +// Workfile : hssdrc_define.vh +// +// Description : controller hardware paramters & settings +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +`ifndef __HSSDRC_DEFINE_VH__ + + `define __HSSDRC_DEFINE_VH__ + + //`define HSSDRC_DQ_PIPELINE // uncomment when need dq data register output + //`define HSSDRC_REFR_HI_DISABLE // uncomment when not need high priority refresh logic + //`define HSSDRC_REFR_LOW_DISABLE // uncomment when not need low priority refresh logic + //---------------------------------------------------------------------------------- + // default : controller used use_wdata signal with register output type + // optionaly : controller can use combinative use_wdata signal which set 1 cycle early + //---------------------------------------------------------------------------------- + //`define HSSDRC_COMBINATORY_USE_WDATA // uncomment when need to use non register use_wdata signal + //---------------------------------------------------------------------------------- + // default : decoders sharing PRE & ACT command inside sdram command pipeline waiting + //---------------------------------------------------------------------------------- + //`define HSSDRC_NOT_SHARE_ACT_COMMAND // uncomment for not generate logic for share ACT command + //---------------------------------------------------------------------------------- + // default : 2 decoders sharing sdram command pipeline inside PRE & ACT command waiting + //---------------------------------------------------------------------------------- + //`define HSSDRC_SHARE_ONE_DECODER // uncoment for only 1 decoder share + //`define HSSDRC_SHARE_NONE_DECODER // uncoment for none decoder share + //---------------------------------------------------------------------------------- + // sdram controller command interface parameters + //---------------------------------------------------------------------------------- + parameter int pRowaBits = 11; // >= 11 (0..10) + parameter int pColaBits = 8; // <= pRowBits + parameter int pBaBits = 2; // fixed == 2 (don't change !!!) + parameter int pBurstBits = 4; // <= 4 + parameter int pChIdBits = 2; // >= 1 + //---------------------------------------------------------------------------------- + // sdram controller data interface & sdram chip data interface parameters + //---------------------------------------------------------------------------------- + parameter int pDataBits = 32; // >= 8 + parameter int pDatamBits = byte_lanes(pDataBits); + //---------------------------------------------------------------------------------- + // sdram controller command interface parameters + //---------------------------------------------------------------------------------- + parameter int pSdramAddrBits = 11; // (>= pRowaBits & >= 11) + parameter int pSdramBurstBits = 2; // fixed == 2 (don't change !!!) + parameter int cSdramBL = 2**pSdramBurstBits; + //---------------------------------------------------------------------------------- + // sdram controller mode parameters (don't change except CL !!!!) + //---------------------------------------------------------------------------------- + parameter bit pInitWBM = 1'b0; // write burst mode = programed burst + parameter bit [1:0] pInitOM = 1'b0; // operation mode = standart + parameter bit [2:0] pCL = 3'b011; // cas latency = 3 + parameter bit pInitBT = 1'b0; // burst type = sequental + parameter bit [2:0] pInitBL = 3'b010; // burst = 4 + + parameter bit [pSdramAddrBits-1:10] pReserved = '0; + parameter bit [pSdramAddrBits-1: 0] cInitLmrValue = {pReserved, pInitWBM, pInitOM, pCL, pInitBT, pInitBL}; + //---------------------------------------------------------------------------------- + // used types + //---------------------------------------------------------------------------------- + typedef logic [pColaBits - 1 : 0] cola_t; + typedef logic [pRowaBits - 1 : 0] rowa_t; + typedef logic [pBaBits - 1 : 0] ba_t; + typedef logic [pBurstBits - 1 : 0] burst_t; + typedef logic [pChIdBits - 1 : 0] chid_t; + typedef logic [pDataBits - 1 : 0] data_t; + typedef logic [pDatamBits - 1 : 0] datam_t; + + typedef logic [pSdramAddrBits-1 :0] sdram_addr_t; + typedef logic [pSdramBurstBits-1:0] sdram_burst_t; + //---------------------------------------------------------------------------------- + // + //---------------------------------------------------------------------------------- + function automatic int clogb2 (input int data); + int i; + + for (i = 0; 2**i < data; i++) + clogb2 = i + 1; + endfunction + //---------------------------------------------------------------------------------- + // + //---------------------------------------------------------------------------------- + function automatic int byte_lanes (input int data); + int num; + + byte_lanes = 0; + + num = data; + // synthesis translate_off + assert (num != 0) else $error ("wrong data parameter"); + // synthesis translate_on + while (num > 0) begin + byte_lanes++; + num = num - 8; + end + + endfunction + //---------------------------------------------------------------------------------- + // + //---------------------------------------------------------------------------------- + function automatic int unsigned max(input int unsigned a, b); + if (a >= b) max = a; + else max = b; + endfunction + +`endif +
hssdrc/trunk/include/hssdrc_define.vh Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/include/tb_define.svh =================================================================== --- hssdrc/trunk/include/tb_define.svh (nonexistent) +++ hssdrc/trunk/include/tb_define.svh (revision 3) @@ -0,0 +1,157 @@ +// +// Project : High-Speed SDRAM Controller with adaptive bank management and command pipeline +// +// Project Nick : HSSDRC +// +// Version : 1.0-beta +// +// Revision : $Revision: 1.1 $ +// +// Date : $Date: 2008-03-06 13:51:55 $ +// +// Workfile : tb_define.svh +// +// Description : testbench types, values, parameters +// +// HSSDRC is licensed under MIT License +// +// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + + +`include "hssdrc_define.vh" + +`ifndef __TB_DEFINE_SVH__ + + `define __TB_DEFINE_SVH__ + + // + // tb types without Z, X states + // + typedef bit [pColaBits - 1 : 0] tb_cola_t; + typedef bit [pRowaBits - 1 : 0] tb_rowa_t; + typedef bit [pBaBits - 1 : 0] tb_ba_t; + typedef bit [pBurstBits - 1 : 0] tb_burst_t; + typedef bit [pChIdBits - 1 : 0] tb_chid_t; + typedef bit [pDataBits - 1 : 0] tb_data_t; + typedef bit [pDatamBits - 1 : 0] tb_datam_t; + + // + // ram test parameters for correctness test + // + + localparam int cColaMaxValue = 2**pColaBits; + localparam int cRowaMaxValue = 2**pRowaBits; + localparam int cBaMaxValue = 2**pBaBits; + localparam int cBurstMaxValue = 2**pBurstBits; + + // + // number of transactions in random correctness test + // + + localparam int cTransactionMaxValue = cColaMaxValue*cBaMaxValue*cRowaMaxValue; + + // + // time interval for bandwidth measure for each bandwidth measure mode + // + + const time cPerfomanceInterval = 200us;//10ms; + + // + // number of transaction for done log message + // + + const int cTransactionLogPeriod = 1024; + + // + // bandwidth measure modes + // + + typedef struct packed { + bit read_mode; + bit write_mode; + } test_mode_t; // used tests : 1 - write, 2 - read, 3 write -> read; + + int burst_mode [$] = '{1, 2, 3, 4, 5}; + int address_mode [$] = '{0, 1, 2, 3, 4, 5}; + test_mode_t test_mode [$] = '{1, 2, 3} ; + + const string test_mode_name [4] = '{ + 0 : "error mode", + 1 : "sequental write", + 2 : "sequental read", + 3 : "sequental write -> read" + }; + + const string burst_mode_name [7] = '{ + 0 : "burst mode : {any, no cola allign}", + 1 : "burst mode : {fixed == 1, cola allign}", + 2 : "burst mode : {fixed == 2, cola allign}", + 3 : "burst mode : {fixed == 4, cola allign}", + 4 : "burst mode : {fixed == 8, cola allign}", + 5 : "burst mode : {fixed == 16, cola allign}", + 6 : "burst mode : {any inside [1,2, 4,8,16], cola allign}" + }; + + const string address_mode_name [8] = '{ + 0 : "address mode : {same bank : same row}", + 1 : "address mode : {same bank : any row}", + 2 : "address mode : {any bank : same row}", + 3 : "address mode : {linear bank : same row}", + 4 : "address mode : {any bank : any row}", + 5 : "address mode : {linear bank : any row}", + 6 : "address mode : {any bank : any row : ba varies more often than rowa}", + 7 : "address mode : {any bank : any row : ba varies less often than rowa}" + }; + + // + // virtual transaction tread types & parameters + // + + localparam int cTreadMaxNumber = cBaMaxValue*cRowaMaxValue; + localparam int cTreadPointerWidth = clogb2(cTreadMaxNumber); + + typedef bit [cTreadPointerWidth-1:0] sdram_tread_ptr_t; + + typedef struct { + ba_t ba; + rowa_t rowa; + cola_t cola; + } sdram_tread_state_s_t; + + // + // sdram transaction types + // + + typedef enum {cTR_WRITE, cTR_READ, cTR_REFR, + cTR_WRITE_LOCKED, cTR_READ_LOCKED, cTR_REFR_LOCKED + } tr_type_e_t; + + // + // transaction acknowledge mailbox. use only for locked transaction + // + + typedef mailbox #(tr_type_e_t) sdram_tr_ack_mbx; + + // + // + // + +`endif
hssdrc/trunk/include/tb_define.svh Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/doc/hssdrc_design_document_rev10.odt =================================================================== --- hssdrc/trunk/doc/hssdrc_design_document_rev10.odt (nonexistent) +++ hssdrc/trunk/doc/hssdrc_design_document_rev10.odt (revision 3) @@ -0,0 +1,515 @@ +PK×.f8^Æ2 ''mimetypeapplication/vnd.oasis.opendocument.textPK×.f8Configurations2/statusbar/PK×.f8'Configurations2/accelerator/current.xmlPKPK×.f8Configurations2/floater/PK×.f8Configurations2/popupmenu/PK×.f8Configurations2/progressbar/PK×.f8Configurations2/menubar/PK×.f8Configurations2/toolbar/PK×.f8Configurations2/images/Bitmaps/PK×.f8-Pictures/2000041A0000356F0000214891083746.wmfíœ tTÕ†ÿ{“@xi3¦Fc‹«v¹šªÍ‚QP|Ä ˆõQˆ‚­êŠPÅúìÂJF*…å«B0¼¢‰-hM +ŠMŠ¦ûžûÏžs'‘‰Ö¶—µÎº{çŸpgæîÎ= ½€¸!é@o¤Áù/#ÎJD‚ûÚìÛ‰úØÎ\¢Œ=YF ÛÑ%IO9îÞÚÚj»Ž²,S¡—yœY¶3ëD¶e‘¹³ÎÏý—ýi«[ô.+ü[ŒœW?7j{ÅjK:ª’)UÎŽ¹J–T™s•l©2;æ*9Råј«äJ•U1W(U¶Ä\eTÙs•<©r k•ÁR%3Æ*623Ò­‚Ø«d¦[b¯’•nÝ{•ìtëØ«ä¤[5±WÉM·b¯20ÝÚÙ +Ïô+=Æ×®¬ »ªdglCìUr2꺡JnÆãÝPe`ÆmÝPePÆ”n¨’—1¢ª ÎÈŠ¡J¢©'¯º px§uÚúïöN*Efó´ã·Xè89þØü_Râ±þi…ÕÃr~t?‡Ç%`6b”7šÜU…?±´×_†y˜fF¥Ä•&¦Ÿ/Ÿ˜1Câ&¦O¶NCª…š<š~—u4¾0#Gâ“Gôî¹±÷97==>5%ò¬6ð3N$J¶_ÃH²Wå\¹,„ÑdõC¶ç‘­ÅùdkpY-."[‹ÉžÃ8²Œ'[Œ d‹0‘ìi\Bö&“-Ä¥d ä™pÙ£˜JöˆFá³°gÎea:Ùƒ¸Šì”’Íŵd÷á:²{ñ[²9¸‘ìnÜLvf’Ý[ÈnÇ­d·âv²[pÙ,ÜM6÷Ý„{ÉnÄÉnÀŸÈ®Çýd× ‚ìj&;;ÉFãS²Qøœìì&‰½dÅøŠìlؼþ!ÞrÙ$’…Þd…H";!ï^— +ÇdÃåí²BV€Ÿ(;ŒìtüŒìt¡ìd§™k­ÃNC¦²l²S1ˆìT &;Ç‘‚¡ÊNTv2ÙÉ8ìd¤Ÿ×OÂe#•";瑈óɆáb²a§l"Ù ¸„ì\¦l*Ùñ˜Fv<®Tv5ÙPü†l(nPv#ÙÜL6³ÈŽÃl²ãð{ew)»‡ìXÜKv,î#ËG9Y>Tög²c0Ÿì<¦lÙ`ÙŒ|‰óMMŸ"óifäKœoòˆ¾kÑYl9ÏUe½•õUÖ_Ù•¥(;HYš²4tíuú PX8 H–¤Ù¡’¥t±ûi÷/Òî_¤Ý¿H»‘vÿ"íþEÚý‹´ûi÷/Òî_ô­tÿðÝZ‡E¼N×VHŠÍêˆÓ¥Õ‘“»ªŽ}V‰Yqº¡³:2ßäÑô•fuÄé!NG™fòhú³:2\ŽÎêÈp“GÓ·˜Õ‘L9:«#™&è;v/‰g²—ï^|÷â»ß½Àw/.óÝKlî%‘½»WVHzb’xŒ §ˆ*hrWÕqçë/óÉ¢ë/ú$sŒ®O•ù4Ñ¥Š>ÅÛê»Öƒê‘‚ê‘‚ê‘‚ê‘‚ê‘‚ê‘‚ê‘‚ê‘‚ê‘‚ê‘‚x¤ŽÏ£³ç«c¯”ø­x¦¾æLÆÓ3¹w”¼üRX[Òæn’—W +k+ÛÜIòòIamJ›»H^)¬misÉ÷G¾?òý‘ï\æû#ß}ßýQ¸‹õ”kjoÌÅ,»ŠŽ;^™O]’ŒþhSe>Mt)2RÛi»Ö +ËÔ•©'*SOT¦ž¨L=Q™z¢2õDeê‰ÊÔ•©'*ûN"{;È^À.²ðY¾ «SR‡/ÉÖ¢•l +ß¡ŽÓNà5xµ¼s]¶}ÈVÑ™$Kô²•t&Éí¢éì!Ê%«¥Gqþþà§ÊŽPöseG)û%Ùóô(Éå*¬,_ÙP²8l=ŠÃNU6\ٙʊȖ£˜l9F+£ìe)O¶ È–éß²,Ã¥ÊJ”]Aöf=‡Re×*»^ÙMÊÊÈ–âwdKq«²Û•Ý©ìÊæÕ`.Y +îWV¡lž²G”U’-ÁB²%xBÙ3ÊžUVMV²jý»›j<¯lµ²µÊÖ‘-F=Ùb¬W¶AYƒ²7”½EVEèoÊÞSÖ¤ìC²Eø˜l=ŠÃ>UöÙ×ÜÊ7Ûï2W:¿3*$®0¹«òÚï2W‹3*$®0y4}ŠÌ§™Q!q…É#ú®u­ru.åê\ÊÕ¹”«s)WçR®Î¥\K¹:—ru.åê\Ê¿ãý.½­Ñrµ ïwÙ%Ÿá·ë~—ÍÒ36ê~—µ8XœBx¿Ëì°¿û]üþï÷¿ÿ»Ìïÿ~ÿÿëÿn©AüE÷¢Ô Y’f‡JÖÕ½(UÚ™«´3Wig®ÒÎ\¥¹J;s•væ*íÌUÚ™«´3W}÷¢8« +NuVœcô•…³ª°CŽÎªÂ“GÓWšU§‡8« + +&¦O1« ++åè¬*¬4y4}‹YUX$GgUa‘É#úý»×â; ßYøÎÂe¾³ðÅÿ¦³øfûDê¥ÿ‡ä¸AT!“»*¯}"õH]Ñ'™ct}ªÌ§‰.Uô)æØVßµ®RÿRÿRÿRÿRÿRÿRÿRÿRÿRÿú/Ø'¹Kâåe"ûD"wH¼|LdŸHä‡‰ì‰Üñò/‘}"‘»"¾wñ½‹ï]|ïf¾wñ½Ëþ{—ÈŽmÒû›EÑlbWᵇc›ø–fñ,Í&Ž¦M•ù4Ñ¥ÈHm§íZ§jR¿Ò¤~¥IýJ“ú•&õ+MêWšÔ¯4©_iR¿Ò¤~¥©[ýŠ;ùnF—Ç™ŸÐ߃ֶRø»^Æ•f´fÊó™éH“ÙZЩ&«u|§šìÖë¢jâESš1§sMæ“k²^è\“ýŽ‡Æ=c_ÿ¾œ¶ç°—©“€q3¦M¿²uˆåîŒVéh«ýœû|ö5•ÂÏ'lÛ>³x@ñØ©ÓO˜6y"fÞCÆÍͨYYW~eµû†BD¼¬ûÊA[§«³àl´ïþt`œyÌ¿PKA¢ˆ|" |TPK×.f8-Pictures/20000238000035BE00001F511036C053.wmfí›kl×ÅÏõc +vâà–ÜÄ­R5¢ +YÛ@’ªª~@Qê@§J*^1`À6kƒã0¯åá’ýÔ8þwxO¨¶Wö÷ªq:ý8±ãUë–ýn5N§?/îÀEÕfËþl5Nècc +;6¹†»¦ j@LÖ+²,ñS²ÿà6²ãçd_âv² ¸ƒì_˜Av3ÉÎáN²³¨'ûóÉ>a¯Øú É>D#ÙûXLöÂd'±„ìÚÈŽ£ƒì8î"û–“½ƒdG±Šìm¬&;‚Ù¬'{Kß©ýÝd‡p?Ùx€ì 6“À²ýx˜l½‚íd/cÙ ØIÖ]dÏã1²zØëãa±µ ÛƒÝdÏâ)²gð ÙÓø3ÙSè#{ýd‹d»ñ*Ùnì#{ÈÇA²ßãY/Þ$ëÁ_ÉòGñ6Ù.ül'Þ%û-Ž‘íÀ ²8I¶ï“mÇd¿Æi²Gð ÙVœ%ÛŠsd[pžì!|A¶É~…Kdò{^d=K8ì>ù­qØ}È%»cɺQ@¶ WmDÙ”’­—ß]‡­GYW’Eð²u¸šl-®![‹ dk0‘l +Bd«1‰l5¦­ÂÈVá‡d]øY~L¶SÉVâ&²ø Ù +ÜB¶?#[Ž:²_âv²»ñ ²»1‹¬sÈ:1ì.4u ‘¬ÍdËÐJ¶ KÉÚÑAÖŽN²6¬ kCÙR¬%[ŠÙ½°Ýd­¸Ÿ¬’µ` Y ¶’…±l1~C¶;Éšñ(Y3zÉšð8Y#þHÖˆ'ÉáY²EØC¶Ï“-D?Ù¼L¶¯’5`?YÍÇëdóqˆlÞ"›‡Ãdsñ7²z%«Ç»dwrõ¢XöNÍÁI²98E6’ͲYø”l&ΑÍÄgd3ð™Û+NºûÎåÝwnU¶·ßñ¸­Zɲä5ŒjaÙ«±£J]ù +ä|‘jaÙ«q:}©œ¯P-,ûa5NèGW›¤nhÏ>r4£Y¾f…šÓ¬T³ñšUhVÑÇÄê†;Ÿcxÿ©Ó=Ÿ•+ꤼ–£Ñ*Í"Žúe•yNfgtÊe'œÑ\’Yã¼ð3†ÃüŒág ?c8ÌÏ~Æøæ3†S§6a,ÖH掊å¨@¾%G¥£¬þ]ý#ºúGtõèêÑÕ?¢«DWÿˆ®þ]ý#ºúG¾–êï>­µY"ëŒn…dºZ±«´½:boÓ¯4«Õ‘Srk¯ŽœRãtú^µ:bW{u¤OÓéKÔêȹµWG6¨q:ý Z™!·öêÈ 5NèS§— áHæùéÅO/~zñÓ üôâ0?½xK/AÖî¼Q¬äÊëâDåv—TEÕØQ¥®|…r¾Hê +¥¾@mÓëËå|…Ô•K}©Ú&ëGW£:#EuFŠêŒÕ)ª3RTg¤¨ÎHQ‘¢:#EuFŠ¦ÈH©£ý›¯ÔY)øµd¦|u$³˜™œ'J¦¼äj›“ž&™²’«íMz’dÊI®¶$é)’)#¹ÚÁ¤'H~>òó‘Ÿü|ä0?ùùèÿ=¹U,{d¾è—Š~Õw©+^¡œ/’ºÙ +GЖËù +©+•­|ˆvtÕ0¦3QLg¢˜ÎD1‰b:Åt&ŠéLÓ™(¦3QLg¢XF3‘3Ÿø]¿Ãê2ñÚd'÷wBs;CñyòsK̤ÒTÅWŽ¨©Ž?<¢¦&þ´AcúmSò{ÎS>Ù˜ÛÑÖ¾,þ}‘/Frš(†Î9Ç/_9¹Ç–eÝRWYWßÒ^Y×ÐÖ¸÷*ž#[íéÓxaÿkî'9ä×äHäSç“BrzÕ³àlºÿ§aÀÚç¿PK–˜+¹è(2PK×.f8-Pictures/20000258000034EB00001F516ED001C1.wmfí›itU†¿º $lcb hPDéV-,B€€›‚Öd‘miYETÄ•ÈvÐQ‘QpÀQG‘#Œ:£2cæVõ[o&ÕäÐñœù!çÔé{ŸúúKSÝ©ûÔ[CʈÄt¸N¤¬¤ˆý/Vo1F¼”ÒåU]C”=*§ì}ñzûY §R”][GOâôã¿5/((P¡u ÃéPÆyž=2”½×)à íµîEõ]A¨ébÃ}=†û³ÇUMÏέÚ}”?k¤lÛ w¯Þªî=˜+âÃÏQN§ÛŒJž¯/¯Ï‹eµó¯À­.åô³Ô5’æŒLg¤‰ÛéòštÖ¤{Öä°&dzf6kf{Ö¬gÍzÏš×XóšgÍ Öœð¬ù5?xÖ$nM¢áUS‡5uÏŠWÍaÖö¬ÙÊš­ž5+X³Â³f +k¦xÖd±&˳¦-kÚzÖÜš[ß_åÙ§p'û,S­”!¾rÉF½ËÎ~¡Qá3VaRT—TÝ¥sÔ]êé.ã»ÌŠºK}Ýe]Ô]è.»£îÒPwù(ê.t—ï£îÒXwI0¢íÒDw¹5Ê.JR}ÉF›è»¤&£ïR/ÙÈ‹¾KZ²±"ú.õ“­Ñwil¼}—†ÉÆ7%ðNW0jDùÙURÏwA¢ï’æ;V]êûv–@—¾Õ%Ð¥¡/P]ù†•@—ƾN%Ð¥‰ÏE—x§KŒþÔù¤¢ÜxÅ>—¯ß¡‘mCî(¼7­q}PZbôã +Îÿ%)6Þ¸`¸Ï*mØ?úwz»)¦”t”¤›³ÐãÎIïOq6¿ûy¸¾xk¸;^:2õ¨4YY²òd d×’%‘U"K!K‘âÇpãî/íñú‹ö6{V)ö mŸjC Í6êõvµ>2¡YKyJ›ÕÌ,}ÝÉ}¯g猫³¡3´¡3´¡¿Ò†>™êcÚÐq8©ŽÁ,udjêö6mè-8¥H_°ýYjŸôÛCóÙEóÙ‰‘¥^¥ùl•A`/ÂwLíO®ùl†ï˜ÚŸ†m„ï˜êIøŽ¥ÖÊ°Õ°K­ÒŸÇ[IßYË1ÕRúÎbúÎBúÎ|™6—¾3[{æc©é’6M¦€M†ù˜êA™6æcjk +€¡¢ å`d©¡t lŒlWZ@WZDWZLWZÖ 6d»’ëEÝèE]éEèEèEí$Ö†d©Vúsb-e-X3fÿMåI0×LÕDž¡+mk$/€5WÀÈV°4ÙVOv‚¥òÞAªìs +ÉÔ†´¬Ž»UÑ•Þ»EÞûƒ«)‚Ý,«!ƒÝ¤‹C¬ºœ«&ŸƒU“/Á\C²]é°*r,Eþv=ï]\'ÿ«,Á*ÉÀ’ÄÀ +$ ++€kH¶+Ń]+åÁõ9Ä]=¹z˜dÉd•ÉªÝHV¬Y-²ÚduÉRÉ5"kJÖœ¬Yk²vdíÉ:“u!Ë ëIÖ‡ì²dYdÙdÃÈFùÉÆ#Ë%{€l +Ù4²Ù,²¹dóÉ‘-![FöÙ*²'ÈÖ‘m ÛDö Ù²È^!Ë'ÛA¶‹lÙ>²ýd&;DöٲȎ“ ;Iö)ÙgdŸ“}Ev–ìÛ«2¤Ð*û°”ÓgæXqg–žUଊž%Ó]t—Ý%@w Ð]t—Ý%@w Ð]t—Ý%𫸋{WÜfaS+^•.¶AœÒ§µãœr桪¢-1G¯8~½Âäèe˜ó¸çm€o™Ú>‚­fÖõ³®•´¬̺–Ò²¥e-‚[Ùy_lÜÊÎûÖ€Íæ=Àðh–lÀÞ®™L¸fÀ²l7}l,ËTS™på1áÊ“`“aYvjè&\“˜på2ášË2õè-°ñL¸Æ1áË„kŒÍo׎bÂågÂågÂ5–e;ñ`ÙpÝÇ„k®¡r,› ×&\ƒ™p +b•Ë2Õ@&\÷2áêÏ„«®~R¬/®¾L¸ú0áêÄ«7®ÞL¸2™pe2áÊdÂÕ‹ W/&\=™põdÂÕ“ W&\=˜pe0áÊ`ÂÕ Ww&\ݘpu“t²î`]¥XWéMÖ¬‹Ü ÖE‚¥ó›Èé2¬³ä€u–ûÁ:Éh°N2–l"XG™ÖQòÀ:ÈT°2¬½<Ö^æÍ»[‚Ý-‹ÁÚÉR°v²¬­<Ö߶TY ÖFÖ“=v—< +v—<ÖZžkMËjM˺“–u'-«-«-«%-«%-«%-«-«-ëZÖ´¬;hYÍiYÍiYÍhYÍhYMiYMiY·Ó²n¿JËr×Â8}*«Ï8±z‹ÃÙÈkÝLÐûM]WAo W¨­¬÷§èº$½U¾¤¶xkj>Í*Ÿf•O³Ê§YåÓ¬òiVù4«|šU>Í*Ÿf•_¢fÚþ’q~BI|_»p'÷;iƒr}ƒõûÞSTMjAÞkê,»bMZÁó5^ߣ+üšË8}JÉ  cÇ/¨m„Îá‘:Ýf\º/tüÊ;Üã'J©ÎU3²FŽ«š‘=vøP}Ž±qi½uúúkÙ±ï@®ûN^ò— ¶ÜÐ;%…˜{{#ýM +cœçüPK`”<6 +”4PK×.f8-Pictures/2000041E0000356F00002148F76C0DB2.wmfíœ pTÕÇÿ÷&ð¦Ýuk4¶tjÇiê#Á¨øVkTDE‘(D‰˜Zµ–¦Ø +Uk­:ØØÈFa´Z 1 +^QDW@PÐBQ©©Ñ¢ ©BµéwÏýï·ÌÝD6:Ú^fÎÜs~÷Ÿ“°»¹ßoÏ=Y ½€”sr€ÞȆó/UZŠ•Ž49öµO±Òl§×ÇvÎ¥KÛ'=Ë$a;Ù£eÐSŽŸ +okk³ÝŽ¶,3C/óuNϲ³N϶,2÷¬ó}ÿmØæNú;+úSœ;yJiEÿ‘¥•ýÏ)Ÿ2~*ê×4U6Jë߸¶Èå÷±ÍLÇX‡xþ|)üùHùu©š6ÿÚ¢é43_Ð>E¦°µŠiÿL‰fJ<3åš)÷ÌÌÖÌlÏL­fj=3«4³Ê3³]3Û=3û4³Ï3²¢™å•É×L¾gf¤fFzf&kf²gf¦ffzfæjf®gf™f–yf¶jf«g¦U3­í2OüÚs^qm,ó©¾>?…Wf»f¶{f5Óè™™§™yž™™š™é™™¤™Iž™ašæ™9J3Gyfúi¦>ÿøïõùè¯>ñ39W™ï§YÈ=8Ç´ßÕÏíÅ_±âIG³äÉ,ç$=K¾Ì25éY +d–YIÏ2@fy0éY +e–•IÏ2PfÙ–ô,ƒd–½IÏR$³l%;Ë`™%/ÉYläåæXÃ’Ÿ%/Ç*M~–ükFò³äX÷'?Ë€«!ùY +s¬ÍÉÏ20ÇÚÝ +Ït+'É×®ü\»f)È݉ägÛÔ +³æ>Ü +³ ÌÝ +³ ÊÒ +³åŽî†Yçæ'1Kº™%E^u¹×qD§óÄûw{“Šöbg‹´â·Z¿è9~×ü_B©‡Yÿ²¢_ÕÃr¾u?iG¤¤a46â|Ó¶H‹»©è;–öù«0ÓL«•~­'ÊÏÇÕXhÚuÒ¿ÎŒåÖPd™6Jú£Ì8Q~u,>1­Pú…fË»½ßcÓÓã]S:ÕÍ|ëì—q.Ùzy¬\Á²uK¶’­ÁÅd«1Ž¬—’-ÇedOcY&’-A)Ùb\Nö® û3&“-•d å™pÙƒ˜J¶@{óùŽ,h;ÏœË梂ìOò¼¸¬?%»7ÍÁd÷àf²?`Ùïñ+²;1“ìvü†ì·˜E6 ·‘ÝŠÛÉnÁd3qÙ/qÙ ÜKösÜGvªÉ~†²ëñY%æ‘MDz +Ù0ülŽTöc²¡æªë°¡ÈSV@v‘…Ádgâ²31DÙ©ÊN';CÉÎÀp²Ó1Šìt„•GvƆ‹”#;ãÉNÅDe“ÈNáûý ô¦(+';d'c:ÙI¸žì$Ü ìfe3Ȇè*ÁüšìDÌ&;·)»“ìÜEvîU6‡ìxÜOv<Ñúì´ÚÚœdûš–ŠBô6­XúÅfì¦:®r>`Z±ô‹Í8Q>$ç³M+–~±Çò]«‘Îú`ûžó¼ôPÖ[Y_e™Ê¾­,¤ìeÙʲѵÇ1¶Î=ßÃãçïØ‹œÑ!©[¥žorGI}œ+UÕUb‘˜Ë|ŽFãPñ’€åŽb¯XÇË· +·çÛ†o¾m¸Ì· +ß6¾N¶áV¬óÐ#…EGAeèèp…ºèaõ€°z@X= ¬V«„ÕÂêaõ€°z@øKñ€è\‡Å¬§k«&%fÅÄ©×ΊÉf3vSW¹Y1qꢳb2ߌåkÍŠI…“ +3N”™çj笘Œ0ãDùV³b’/GgÅ$ߌcùŽ=&Ýã‘ìå{Œï1¾Çøßc\æ{LwyL:«x¯.¬šôÄ$±29N‘T™»©Žk`¦œH.Sòæ˜8Ÿ%ç³%—%ù9Æç»V#ËÔ–ÊÔ–ÊÔ–ÊÔ–ÊÔ–ÊÔ–ÊÔ–ÊÔ–ÊÔ–ÊÔ–Ê:°¥ŽGgGXÇÖ”þ¥ØS_óH¦ÒžÜûM^æÍ–ÇÝkò²¦h¶6î>“—1E³¡¸{L^¶ͶÆÝ_òMÉ7%ß”|Sr™oJ¾)}sL)ZÏzâb·HâÓw×¾L9\†´ÌN²Yr>[r!iYí²]«‹UjGUjGUjGUjGUjGUjGUjGUjGUjGUjGU_‰uuïMŠu¾i½¬Ñ¦¹×Bï½7ïJuuÚnéï6ãDùùRš¶Eú[Ì8Q>`-—k¦ÓVKµ'Êï±/rZ½ôëÍ8–?°»a=¬’ýz;ÍŠº‘m]@fYcÉþ£ô.!Û‡ñd{i?AûcužVš{ÐÞ#ï²Ý4 ý¾ZM¬·‹6´ßõdïb:Y ®'{‡V´›ÕeÞæoBÐþ»ºÌNù +qÙ›4˜€ôf“íÀd£Áím¸›l +&h¿®ÞòšzË<@¶…¶´_¡­Ä7Ô^-ÏnÂ"²Mx„ìeø‹îOi@PF::\F]ÝŸR§•¹N+sVæ:­ÌuZ™ë´2×ie®ÓÊ\§•¹N+sÝ×pŠ³ªàTPgUÁ9&^Y(7« +»äè¬*ì2ãDùZ³ªàÔgUa³'ʇ̪ +9:« ++Ì8Q¾Õ¬*,–£³ª°ØŒcù»ëâ›…o¾Y¸Ì7 ß,þ7Íâ‹íY'õ?"Ç +’Š˜±›òÚ1²ÉeJ>Ãç³ä|¶ä²$2Çø|תVDý%¢þQ‰¨¿DÔ_"ê/õ—ˆúKDý%¢þùì‰Ý%ñr™ØŽ‘Ø/‰í‰Ýñr˜ØŽ‘Ø/‰í‰ÝñÝÅwß]|w‰2ß]|w9pw‰íáØ)µ¿E-¦ï&¼öpìoigi1ýDÙ,9Ÿ-¹´¬vÙ®Uªfõ•fõ•fõ•fõ•fõ•fõ•fõ•fõ•fõ•fõ•ænõ÷|ì3]žb¾Cw|^ZüLÑÏ„™P™Û–'Ï[ìLG™¼¶afòÛ&vš)h»1a&U2•¹wwžÉ{´óLþ³g +vxdÜGìóŸ«ÿö2ó¤aÂôi׶heXÍtŒÕþœû|ö53EŸOض}vIÿ’ñS+ú—”N›|9fÞCÚˆ–4¬hªŒ¾²Ú}’!b.ë¾roºz<›è3B˜b¾æ¿PK‰×ïU% ¤TPK×.f8-Pictures/20000261000034EB00001F5190F59A27.wmfµÛ œMåÇñg­f\g­fÒ™J·ãTh×4"ErŸ!—ˆaÜrk$$;J å’Ë „ŠD”„¤¢„IR©SNáÄ‘Nç4ç]k?û7C³‡cO>ŸõÙïú®gÞkïYë¿Ÿw%¥D¢V^*RZÅûm¶(+VJ˜Ç²ö–ØÞ¨Œí‹5Û¿ÍÈò+Åöj«šóøãyyyvp†ª–åÏPÊÿ:odÙÞQod[–Zð¨÷}OÛ'ó‚“NµB?E»~™½†VjÕ+«Rê Ìô²nÛ;Y›ÍVióö,‘$ý>¶?S5ë’°?_”þ|ªúuÑTûÿòBÕ%üù\û"IöGŽc%Kh¦³kZQÓ*lMjú‡­™@Í„°5‹¨Y¶æMjÞ [³ŸšýakNQs*lM+TSÁ +WS•šªakšQÓ,lM5akÆR36lM65ÙakÖS³>lM.5¹akŽSsüŒÏ‹~íy¯¸Â¿6¿æ¯Ï#®f5»ÂÖ¬¡fMØšYÔÌ +[3ššÑakÒ©I[Ó„š&ak®§æú°5ù¿¿ÉïÏÿÙWŸŸ.ðêSp&ï*se K’Ê'X5κúG¯X¥°Yª›YZFx–:f–Ÿ"ž¥®™%Ίt–zf–*ÎbKõ¤ëöÈg©ž`u|– Ö¨ÈgIN°fE>KÍkMä³ÔJ°vG>Kíëh1<Óå¬k#|íÚR#é„D>KrÒÞb˜¥fÒëÅ0K­¤ùÅ0Kí¤@1ÌR'©O1ÌR7©E1ÌR/))‚YbýY¢Ì«.I.–+Î9ÏÙ÷ïàÈKC¡QþÑ䉫ðw%%Ê<^îÿ_â£c­Vè«JZÞ·.o¶k¢JHsy[ÚúÛ3Þáï«BïXάï#}%Óßšñ@¿¨úRN–ø›cÆŽ¿_T}y«œ¸þ昱ãïUÌ?éoŽ;þ~~}ðÜØg›˜0ïšbõ¬¾«ïqòGŽ½MZ«m‘6j›täÚ$Uíu¹öZIS[#íÔVI{µ•r—Ú‹ÒAíy¹ö騶X:©-ÎjóänµÙÒEíéª6MîQ{JG®=Yº©M’îjIºÚé¡6Nzª• µQÒKm¤Ž\;Kz« +7¯€  +ÖW‚c’~jx'Ø_¨õ6¯ e˜×OÐÒå>µn2X­‹ Uë,ÃÔ:Èýjíe„Zª< ÖFTk!£ÕšËµ¦2V­‰<¬v«ÔÉ#j)¼3½YU«+ÕjËjÉ2I­ºLV«&SÕªÈSj×É4µÊ2]황v•<£v¹ÌV»Læ¨U”lµKdžš+Ϫ9:rí8Y¬g~ÓBö¶{[å`ë° +ØFl ¶{ÛŽíÄvac{±ýØìKìö-v;‚ÃN`'±a¿bÿÅò°(+d%¬•ÂÊ`aqŒ*pôb,û3vv%v5V»«ŠÝˆ%cµ°zX}ì¬v;ÖkŽµÄÚbiX¬Öë†õÄzaý°Ø l06ËÂÄFccìQl"ö$6›†ÍÀfcs±ØBl ¶ [Ž½„­Æ^ÅÖa¯a±MØVl¶{Û…íÁöbû°ØAìö +vû;†ý¨–ßYˆÑÎB¬„‡÷XÙÊËó*ϼKG›»DiË4ãL?XUø]½œ9îø[¦gúûEÕÇ›ã‰þ–iÆ™þ~~ýùÝõ½Nå™#ï®U+•Åâ°?añØ%X"–(çwó;7¡ã%Ãüü…'=oï’è¯M9`2]pož¹ßÎ4g&¸çÊRs^°w±INå­ÐÞOfï˜uaùé òÓä§ÏÉOŸ’Ÿö™Ô´ÉO{45¹öN²Ò:rí÷ÈJïhBrí·4!9öfMH®½Q’c’Yµuä¢MC®½ZÓc’YºÚ +MCŽIf=Õ–’–êkÌ1ɬ¯Ú\M>Ž=‡ä3[G®=S3cO—{Õ¦jrLF ¥¡'HCICãeˆZ@s‘k?$ÃÕÆèÈ5-Km„Ž\{ i¨ŒT¤Yɱ3e”Z?ÍJŽÝ‡Ô”Ajê¡#×¾GÆ©uÑüäÚ4?9&£WKÓüäØmIR-IR-täÚwh¦ò’Ù$’Ùd’Y(]¥®êëȵëÈÓjµ4g¹v +ÍYŽ$3ÔªhÎòú§¡ÄU™Äu­Ž\ûJ™«v…f/×NÔìåØ—Ê|µx ¥°Pó®—¡õŠ8y{{[‰­ÂÖ`k±×±7°ÍØ[Ø;Ø{Ø؇ØGX.ö)öööö7ì;ìì(vû'ö3ö öì7Ìæ~Í=(+•?+…yæbñØ¥X"V » +û öW¬ +V +«ÕÄêb7a +°†ØmXìN¬ÖKÅîÂ:b]°{°XÖë +ÄîÆa÷c#±QØXl6{ ›„MƞƦc³°9Ø|ìYì9l)ö"¶[…½‚­ÅÖco`oboaocïa;°±ÝX.ö öö9öö5ööwì(öÿ#{ïßJsµŽ–Оköʱw™Ù‹?ÏT HERQ€T HERQ€T HE?$…Vè=ËÏ€ç×k%{L6É5ûLzÊõ÷ƒU…çÏþæ>˜)ÌãD“ +&øûEÕ/ò;bÞýÂëˆÅùûEÕWð;bÞ;M¯#çïUÜk±ß‹ó÷óë Ou±aÎd)}nrIu¹¤ºHu’ê> Õm'Õ½KªÛª½0ÇÞBªÛ¨½0Ç~ƒØz:`k逽Bl°tÀ–Ó[FÒ[BÒ[HÒ[@Ò›KÒ›CÒ›©}//£…’ÞTº]“év=A·k"Ý®ñd¾Ý®±t»ÆïF’ïFï‘ï’ïú“ïúÒËÐTçØ=é€u£ÖUG®ÝYRëH–kG–K%˵&˵$Ë5#ËÝA–»,w«<®Ö€®XŠ<©VO¦¨ÕÑ‘k×Ôþ˜cÒÚÓjÕÈmUÈm×Ñ)«Ln»šÜv¹írr["¹­¢¦5ÇN0¿eAsd¡ZMkþûz²È2l9ö¶{[‡½†mÄ6a[±mØvì}l¶Û‹íÃ`±CØ7Øaì{ìö#v;…ýŠÆò0‹{U îU1X¬Vs°¬"vvv5v-vvv#V«…ÕÁêc)X#¬1Ök†µÄZciX{¬v7Ö +KÇza}°X&6Šea`£±‡°6›ˆ=MÁžÂf`Ï`s±yØBl1¶ {{ {{ËÁ^Ã6`›°-Ø6ì]ì}l'¶ûÛ‡íÇb_bß`ßbßcG°±ß÷Ìb5µ”:žYŒ¹¶•6ײsíŠögyÏ3ÇS篱eûûEÕW4ǽkeESï?¬?¿LM:Ì&f“³I‡Ù¤ÃlÒa6é0›t˜M:Ì&f’ ?Þçí +O‰±HZ,ëŸÉh“†~1™ç7“óÇ…õPmÙmÁ'&G|⋪]dîÍKä1óü<拪­`u0 ±«I‡]ýqQµÇ­:&¦˜d˜âók/,ž&ž&þJ2üYó cŸbmô½½ã¬ƒ%ñ!ñ&Ý}GºûšµÌC¬edÝòsÖ-÷“Úö‘ÚréÏå>"«í"«í$«í «½§ ͵·éz¤c¿M.Û¬iÌ[å² +ôØ^§Ç¶– –C[M[E{I“——kCyëyòÖRòÖbòÖBúdóé“Ícr6Ùj«Óé‰M“YjSÈQ“ÉQ“£&’£&£òGãuÒ{o·Lmœ®BºöòBm¬ö¿¼æ+jc´ÿå­7¯WE¢zD5’D5‚D•E¢º_û_ŽíP¦ý//YïV¢ý/ÇÌzä}¬Gb=2“õÈLÖ#Ð @'¬°¾tÂúÐ ë­+“®Ý‹Ogèʤk2ûiµº2é­‡‹ÞEºkOÌ뺖Tëª=1o¼¬ZRVgRVgRV'RV'RVGRVGRVRVRVRÖ]¤¬»HYíIYíIYíIYíHYíHYi¤¬4RV*)+•”Õ–”ÕVZa©jm¤Zí‰yÖY­µöÄ3ê®ÖŠOT·’Þj-µ'æ½Ó¹W­…öļõì~µæ2B­¹öÄûN£v§öÄó~éµfÚóìqµ;´'æ½›šªÖT{bŽÍTk¢=1¯3ž­v»öÄ3Z„-U»MžW»M{bŽÝXVª5fe²1+“·²2y++“X™lÄÊdCV&²2Ù•É[X™¼…•É¬L6`e²+“)¬L¦°2y3+“7³2YŸ•Éú¬LÞÄÊäM˜²B÷Âs*m®8Ñf‹Ñ«Q¸ûfœ9rf‹;GmEs<ÑÔÅ›­âµçwOÍ!Yå¬rHV9$«’UÉ*‡d•C²Ê!Yå¬rŠ5Yçÿ-LУüïPŸ;/8Sè³u=²’òzšç-ÿHa5ÕóF³¦FÞŒsÖ$ç­ Sîó€æRþ<%¤Çð!C‡åÝ`¯áEÍTÍ:óXðü•õg +?±m»eZ¥´ôC+¥õÒ¯·¹Æx\Òl-~øA^ÛòNVè™<ã/0$?åŸ))˜9*z´¨¿mò0ÊÿšÿPKeW~Ä +\5PK×.f8-Pictures/200004120000356F00002148A6E6969E.wmfíœ pÕÇÿ» $ AÚ{½%-ÎØ:“ªsqp|à AðH(‰`£­ïZAA­UÚ`TPD­Ö¨È+<@à"ŠŠ(/AnŽ T›~{ö¿ßM0{¹ÑÑÎ2sfÏùí?_âæfÏïž=^ m€´Ór¶Èó/]Zš•‰Vrlg÷´ZÙNï0Û9—)m¿ô,“„ídOA†¯««³Ý +'X–©ÐÆ|Ó³lç¬Ó³-‹Ì=ë|ßoìÝunÑi–÷Sô5zøøÎ}†—tî7vtѼZU]R)­såÊ Êïc›J'Z}¾4þ|¤üºtM›u^º•©¶GwÓ Ù¬îð*œ)ÔL¡of¬fÆúf&kf²of¶ffûf–jf©of³f6ûfökf¿o&by™ˆå—É×L¾o¦fúøfFif”of¢f&úf×Ìã¾™šYà›y_3ïûfj5SÛ ó¥ðä¯=ç×ø×&2ôõy~™ÍšÙ웩ÔL¥of¦ffúf&jf¢of¤fFúfzi¦—oæxÍï›i¯™öøîõ?øî³çï>õ+9w™cZYˆ¶ÏµN>èîçöêß±ê“ƪäI•~)WÉ—*cR®ÒEªÜ“r•“¤ÊS)Wé*U–¤\¥›TÙ”r•“¥Ê¾”«t—*GX©V9Eªä¥XÅF^4×ê•z•¼\kxêUòs­ÛS¯Ò%ך‘z•“r­¹©Wéšk½“z•n¹ÖW-ð›îlå¦øÚµ‘µ[ J—è¤^å¤hu TéÓUºE'·@•“££[ J÷hߨrJ4?…*™¦Jš¼ê¢ãØ&ëÔ÷ï†&åõg»ëŒ_k5þ 5Òäx´ùo‰¤iíµ¼¯jm9ߺ½´cÓZ¡/vc€iû¤¿ÏŒÝ”÷Ž¥aþZ,Ä8Ó–I™'ËÏÂ$»›ÈJ°ìØN6q² ø„l>#‡ÏÉ®Ã.²±ØC6ÿ!}d×à[²kä­šËFÁæèj¤[.‰L²hK6 íɆáp²¡òwì²"AV$ã.‚#Ɇà×dWᲫð²Á8Žl0~Gv¥¹ë:ìJä)Ë'„ndƒÐì +œJvN#»=É.ÇÙd—á|²ËЋìR}ç~)ú*ëO6Èâr²D6CÈ.ÁP²K0‚¬?®&ëk•!+Ä8²BL ë‡Èúád¸…¬·‘õÅd}1‰ìbÜCv1&+›JÖ÷“õÁCdáa²‹ðw²Þ˜AÖ[Wzc&Ù…˜Mv!æõÂ?Èzá² ð/² PAv>æ’ydçaÙyXLv.ªÈÎÅr²s°Šì¬!;ëÈÎÆÛÊÞ#;‹kaém"ë‰-d=ñ‘²dgâßdg¢†ì |Nv†y¿í°Ó±‡Ìë…ë½7Ïà{óLxs¶s<Ϊ«s’ +ç¹ttE[ÓzH¿‡»©ÆçÅ,92­‡ô{˜q²|DÎç˜ÖCú=Ì8‘oÞ¼é¬6ì…¤×ZY[eí”uPöKee•å(ËAó®cbíÃ;ßÚççoÜ•œQÇôý2Çï+rGU/¾s-GâY±™Y +G'q•åŽÎÂ>1‘]V` . $0À@\H` ?uqg±KpúóFaeéè(Ešéêêêêêêêêêê?ˆxOz–0¡æ­®š•gwVVöš±›jÜÂÆš•g®tVV›q²ül³²2UŽÎÊÊT3N–˜••"9:++Efœ,_kVVN—£³²rº'ò»M¦Ï•l¸Mà6ÛnƒÀm\¸Íé6™œÙÛ4cu%CîþmåŸ!÷ôts™t^ì çC’ë ù,sLžÏ–ó9’Ë–|Äëç›7o«A«A«A«A«A«A«A«A«A«A7bP_Gg7Yã&•ùƒU;s%ÓiTî³*?›ò²cë=§ò3)/;»Þ3*?‹ò²‘zϧü ÊËÖÖ{6ØS`O=öä²Àž{úyÛ“7Çeà6±I’˜dún¢ñù°ƒœI.KZ‡&²Ùr>GriÙ +²Í›+KÕ˜JÕ˜JÕ˜JÕ˜JÕ˜JÕ˜JÕ˜JÕ˜JÕ˜JÕ˜Jcjî^ž°5À´NV_ÓÂVc×7±—gŸø‘Óê¤_gÆÉò³°Uæ)§í”þN3N–Y+å>ê´µÒ_kÆÉò»¬×Ä•œ¶Pú Í8‘?´'i¿² +ê…ìˆåùRÈHö Ës£öÖ ²,Ës£¶Ö²¶VY†åyP+k™myÎcYžóü—¦²¿Å²oäš»l?M'l²¯ÕoöªßÔâV²=´š½wª÷ÝMö%­&,x/Ùç˜Jö™ºÌ§ê25x„ìü,ŽGÉâ('û3ÉvÐ`ÂövÌ!ûÏ’mSoÙ¦Þ²/“mÅ+d[Ô[¶¨·lVoÙ¤Þ²I½åC¬ û«É>@Œl#mÅqÕõdïÓVBöl$Û ÿ7È{|ý:N»ƒì]|Löm%$½OÉÖã ²õøŠìmÔ’½E[ Kï²u´•°ý&,ÞoßDï·k‘A¶mÈbÈ"[£Ž²Fe5ÿ¦¿î¨¬Ù*M¶ +•«ì·do —ì +¯,ª,_™ç(+ÕQVª£¬TGY©Ž²Be…:Ê +u”ê(+ÔQ–«£,WGY®Ž²\¥Z¥Z¥Z¥Z¥J¥J¥J¥J¥Je™:Ê2u”eê(ËÔQ–ª£,UGYŠ)ʦ){€l þJ¶(+Sö(Ùb"çsL+—~¹'òÍ›—ÊÔMÊÔMÊÔMÊÔMÊÔMÊÔMÊÔMÊÔMÊÔMÊÔMÊ~ä½2GÊl¶¼½2°Æ‹Ox{eâ2?lÕ½2oÊk¥î•Y„}2Óê^™`†fø`†÷X0Ã3üÿÛ ïÎsqþ©{Qæ",£,%£æîE©Ð¹·BçÞ +{+tî­Ð¹·BçÞ +{+tî­Ð¹·BçÞŠŸà^geÀ™#•ç˜|u`¬Y8 Ggeà€'ËÏ6+Ûåè¬ l7ãdùˆYX-Gge`µ'Ëך•yrtVæ™q"hOSwÜ!pî¸ÃÏÓ¾ß^U2ÃÇä¸NR13vS~{=V!$¹’Ï2Çäùl9Ÿ#¹lÉG̱~¾yóRL +%¦†SC‰©¡ÄÔPbj(15”˜JL +%¦†ûìõH<Ëð³•Ä^Äs ?SIìõH<Ãð³”Ä^Äó ?CIìõH<»ì$°“ÀN;qY`'4w/Å™Ýk$QcúnÂo/Å1“±’ÓO–Í–ó9’‹HËnmÞ\W#‰«‘ÄÕHâj$q5’¸I\$®FW#‰«‘Ä[ÔHÜó‰Ïftyšù-ñ9hõ+yŸõ2´$Z—'¿·Ä™Æ2yu½šÌä×ý¾ÉL—º›’fÒ%S}¨éLÞóMgò—7é²Õ'ã^±ï~^NýkØÆÔi…¡×?¡î4ËI’U:ÑjxÎý}¶3•¼ß'lÛ¾¨°saјñ ‡5Bî~n-­wM +æ.®.ñ^Y +>¡ [u_9¨ï²z<›ì³?˜f¾æPKªæm“F |TPK×.f8-Pictures/200002060000355500001F51E083C96A.wmfíš{hUÆïÝd7iÒ†Ÿ}|6µ÷óC-þRR] êUj+X«˜UhÞÊd¥…šNh:•š84q¥fša¥f š1¥æ84Ç•š3ÐœQj.BsQ©©âRSÅUšh”šh:”]©‚fH©…fT©™€fB©™fF©™‡f>C3G<÷oÏüÅeß×ÑLã÷9ÍTš=ÐìQj: éPjœkaûçÿ²ðJž¿Â+9½’yÅ^WÀ)æ- î$Ö,ýêO'Ùª4P•\Wi¤*1×Uš¨Ê‹®«¬¡*ﺮÒLUŽ¹®ÒBUN»®ÒJU.¸®ÒFU*¹Û*íT¥Þe5Ô‡ù=î«4„ù÷UÃ|Ð}•¦07ÜWYæGÜWióSî«´„ùœë*ím¥ü¦+þíE?U©kþšE\^t4í{ÙM{]s—‹£±êøè*¨o®b×/Zga—qúŸœ9ÙÖ´›Ýó2mWŠsòùï\îUÈÍ^Nc•¯€­cÝìA1tšë"¶TÒ£fê·QþI1tšë"Î¥?@ù÷ÄÐi®‹8—¾œw³j1tšë"Î¥?Où?ÅÐi®‹ØÑ[çF[pn +Ÿ´ÏjÔvµÎ¬‚fëÁÛöØ&°-`=`[Á¶ƒ=Öö4ØN°]`»Áž{lìe°°WÁö½ f€‚í;ö>Ø8؇`‡ÁŽ€ûlì3°)°/ÁN€}vì[°°Ó`gÁ~;öØ,Ø/`s`ó`€]» Ƹd—¬,V¶¬¬¬ì°•`°U`7€Ý v+X=X#X XØí`w€Ý vØÝ`÷‚­»l=Ø°`ƒmëëÓÁ¶ƒÅÁúÀv€í{l7Ø ØØs`Ã`/€½¶ìu0ì-°ý`ï€;6öØa°ÀŽ‚M€M‚›ûìØW`'ÁNÍ€}vì{°s`?‚Í‚ý 6ö«ÍœUVÀ^e™ìkæöFžJ™ÊÌ^àg±b1b4‰ØRe凜¯#Fó˜ˆséC”¯#Fó˜ˆ}~½e+é2g4+++++ UƒÕ‚Õ²üΣ³Š•ùBÅñg÷fTíïe¨«¯CÔGÑ6D‡(:€¨†ús9—ÑŠÎs¯KKæui¯K{]ÚëÒ’ý÷»´u§ž-cƒÄdTIQ)¢k) +åÙ?èŸ ôÏúgý3þ™@ÿL &Ð?èŸ ôÏÄUéŸò‘É·ß*½S¬ÐÍ>g®Ð£"¶TÙJ\¬Ðé ++ô¨ˆséÇÄ +Ýìæ +=*â\ú*±BÒÖ\¡GEœK?/Vèt/+ô¨ˆ}öþTœÉ"¯ÿ{ý_óú¿×ÿ½þ/Ù¿Ýÿƒv÷+Êc•`oP—6hû6© [ªì½£Œò¤+#}©ØæÖ×P¾–t5¤‰mº>¿ÞbÀep\†—aÀep\†—aÀepF—‘ý<šïjdwÁ«â:JÄ™ôÛ®Ãz. rRO{& rR;–ö<@å4¤¶*íY€ÊeHí|ÚsÏaxÃsžÃÌsÿ‡!û@€î6ÅtwñÓØwUÏ(£|éJi”-¢­¡|-éB4j2´ùõ“$\E®" W‘„«HÂU$á*’pI¸Š$\E®"¹¤®ÂÊ;o´ZÜ'>a)ÞxK¯$ß—è¨O=Jß›“ɦiHíZTÓ˜zmQMSj\¡Q½ã‘~ÌE¢Në~ª¯GênݹsUªã™9ëü•ˆJòü1MÓ:º"]›ãý‘®h_oÝmL\Hã¾ÙYöɱ©ùMf¼Gɇg}S,Ýÿ!Ëìl®7”Mèûü +PK¬ý-ü\"-PK×.f8-Pictures/20000234000035BE00001F51D22D0CD3.wmfí›mlTUÆŸs§/SlµÚi§MêÚkŒqÚêf?löÙl*Àhv5ZK m™"åeT¨ +#íVªÀ¦âj»Š_q´¡ Å—Ô„U£h\ŒL`•µˆîì¹ç>÷Ì´;whöŽ›ýp›œÜs~ç¹ÏLïLïÿ¹çÞ +¾åÀ8TÂüÉ‘Í'üÈ•ÛBãjá7ÌÞy†9ç—íÙJ ÃÔ^%ùrû£ä‰D°®B9¨ýÌž0ÌY³gAfÍš¯{Öø6a™öû]Ìl7.¨šÚ©š>/\߆×öíì–­j÷âëÊi‚(w|>¾?Rî—£Õê'a«s•_À¸µªWbä‹ZØN£5Ó´fš£¦UkZ5]ZÓå¨éך~GÍn­Ùí¨ùTk>uԜњ3ŽšRakJ…“¦Zkª5Sµfª£¦EkZ5ZÓé¨éÓš>GÍ Ö :jiÍ!GÍ°Ö Ðœ”<ówÏüÆ¥ß7©9®¿ŸÇá¤Òš!GÍ+Z󊣦Wkz5ZÓᨩךzGÍ­™â¨¯5ã5É¿ß ðŸÇôÙç»ÿòì“êdže~™+:?(jFý¬^ê+•¤s©–.S]»ÔH—×.µÒ¥ÓµËDéÒçÚe’ttí2Yºrírtvír­t ·.×I—KÕ¡ øƒ{—ê hrïRËÝ»ÔÅ&÷.ƒb‡{—IAñ‘{—ÉAñ]>é"q™ËﮚÐ)¸w© +}—‰¡íYp™Ú˜—É¡h\® Í΂˵¡º,¸\ +¹pñ+ŸüÖ…PŠKÎé3º~[=3 +Ù½älmJâJŸÜþBý.e9~qFØ{å ó¥Ï—íW¾\Ôɧ«–'êTƒ°TöËHý|6Õ¾’ý¯Ô8“þIìÀ3ªí‘ý=jœI‘èF¹jke­gÒŸ·ã¬jM²ß¤ÆI½ulŒQÇ&ßáªÉÏ£êÓFõJ CÜ@ö/Ì$û 7’ý€›ÈÎàf²âOd§q Ù)ÜNvõdß`Ù öÆטMvÍd_b.Ù—“Æ|²¿£ì3,&û ²O°„ìc,%û÷“}ˆed±‚ì :ÉÞÇ*²!¬&{kÈÞEÙÛXKöÖ“íG/Ù>l Û‹ÇÉö`Ù ž"D{»xõ0vb3ÙN^&»¯’݉²yØIÖ†]dmxC³½da¼I6Èæâ=²V ‘µà Y > kÆÇdÍ\©sð9Ù&›#dM8JÖ„ãdø†lN‘Í·d +øžÌîR®´óy¥í‡]Ííå"‘0•#«VŽ<¿S-,ûa5¶Té«\‘œ/Q-,ûa5Τ/“󕪅e?¬ÆIýت`‹Ôì™Ç;O³qšjV¬ÙEš•iV®Y¥f•ÛqL®dØóyï?}ò1Gå9ùb†”×qô5æÉô2‡£7d•Ù!ó‰5Z'ÏlÝ2}X£ÙøQæŠÓÂËóò„—'¼ª+}TWú¨®ôQ]飺ÒGu¥êJýY*½}ÖdÉ\3¶•ijÕìÈ檇¹Í¼òѪV=ŽÈ­¹êqD3éûÕª‡YuÌU]jœI_ªV=zäÖ\õèQãLúaµêÑ ·æªGƒ'õé“ŠßáHxIÅK*^Rñ’ +¼¤b1/©Œ=©øY§ Æ°ò‘GežˆÉí&©Š©±¥J_åŠå|‰ÔK}‘ÚfÖWÈùJ©«ú2µMÕ­ +ÆtŠé<Óy(¦óPL硘ÎC1‡b:ÅtŠé<K“‡ÒGó¹­ô¹Èÿ³ä£Bu$s˜¬»BNÙÈÖ¶¦ÜrÊE¶¶?ånS&²µ¥)w‚œò­N¹ äe!/ yYÈËBó²—…þŸ²]±òñ²ÌR1 ú–"}u+–ó%RW$[ñ9´r¾RêÊd«¡[å‹ëü×ù'®óO\矸Î?qâ:ÿÄuþ‰ëü×ù'žÕücÍ'ŸÃ·¸O½B6žyMu²Ÿë¹#J4ÈÏ-9“NSXzNMMbý95µ‰ç4NÏ"¥¾çå“‹;µ/X˜¸RXgøLNÄÈ9ëø*'ûøÁ0ŒëgTͨo[P5£±½¹ «Ï“­îØ1¼¾gÄþ$G<ýdµ>)¤&U= Îfú¿ +úÔ>ÿPK7oâØ1PK×.f8-Pictures/20000257000034EB00001F51DA29F945.wmfµ› ˜MåÇßµf0DÍ´–jdŠ…mÆqÉ-a¸G Æe4îL2®;rË%—Fv®!ITÆ5·ŠÜ +ER(:Q.ÅIçÔqNs¾µÖý÷pfÇžzžõìïû­w^ÓÚÛú~ëÿmš itŸH!‰ë¿Pu„ha’O½Ö+j¢[£»të\˜:þ¥Fš])ºU[^M +¨×+ž••¥;ÊkšÝ¡ ýsÖHÓ­³ÖH×40ç¬õç^×ÍršÎÔÜߢMßÔä!1 Éi1­¤&õ—»÷¤íTGÌÎ}i"ü9ºÝ©‚V,àï‚ß?Êjû¿,·:ŸÝÏÔï‘8{dè´8q;Ý\“Àš„€5)¬I X3‘5Ö,eÍÒ€5ÛY³=`Í ÖœXók~ X¡¹5Z šò¬)°¦)kš¬éÉšžkƲflÀk|k6±fSÀš£¬9°æ +k®ÜPcñÜ?{Ö'.çŸõ×\äçó¢ª9ÄšCkÖ³f}Àš Öd¬ÅšQk’X“°¦1k¬)Çšrküï‘ÿ½þ7ß}®ÝáÝ'{'ë.ó`>M 56칿޹6úMצ@€§¦0\Õ/ñŒãúQyì°´;¤®šÃHk°}’¶[Ú€}$mÁvH{°í™úé¶I:‚­—gÀÞÃÈÔ×J°5™ú*é +¶Rº-“$°¥™úBéæ“ž`’ 6OzÍVï§ÃfI°—¥/Ø4>×MÅÈÔ'És`ÕgÂa^6N–!`é2l„ K“çÁ†Ê `ƒe$ØÖ_Fƒ¥È8°¾2,Y^ë)Àºáóiè]12õgd*X'™ÖNf€µÅÈÔ[É+`-e6Xs™Ö #SR2ÀËk` +ÄV_^«£>ý«-KÀjÊ2°êïˆÃªÉ*°j²¬Š¬«"ëÀâd=X¬l«$[À<òXEÙVAv•—Ý`Ë'`åäX99VVƒ=*Ÿƒ•‘/ÁÊÈW`¥å$Xi9öœ{P¾‹‘ó`%å'°äX ù,Zþv¿\+.¿ƒ—?ÀŠÉÀ¢ÔC¥ÃŠJî™E%Ÿæ0CÂÀ )¡î. —p°puçqY$Ù}dÑd1d‘•!{”ìq² +d±d•Éª“Õ$«CV¬!Yc²§Èš“µ$kMÖŽ¬Yg²gɺ“õ$ëC–BÖŸl ÙP²ád/¥“%O6‘lÙ4²éd¯Í!Ë {l!Ùb²7ÈV½Eö6Ù:²÷È6m"û€l;Ù‡d“í%ÛOöÙa²£d_’}Mv’ì;²³dçÈ~$»Dö3˜?(€t L\k°^Ѳ²¬ÊWÚPµ6²T5NµçNUÎ+suÞ°T5Nµç¹ÕGªóÑö‘ªÆ©öÜ_{+·•6Þ82Ô(?Y!²Âdád÷’E’#‹&‹–Û»ŽþôÅ=Ÿ?À­Y³b¡ç”[|«¼Ì™-—þ²P]gVOVH +µª83SŠ*û¹[sg×Ôì²vgt–t–ôè$ÌÇп¡‡ùú1˜©ùÊšÚ¤í‡ù˜úé¶#Sß%ÁvÐw¶Òw¶`dêè;ë¥;Ø:XŽ¡¬ÉõÕ°CYSo°å°C–cê‹¥ØB¸©/€Ûú|uý6ncèsh93i9ÓeØTZÎdI›(#À^„ï˜úXIß1õ‘2ì 6¾c(Wò‚ +‚ïÊ•&‚õ£ù¤Ð|zÑ|’1²Ê—iH®ùt–™4¤Y4¤94¤94$׆ZÊ«4¤ù`OцšÐ†цêÓ†êÉb°ÚLükÉ4¤•4¤U`Õe + +i- +é}ÒzÒ&Ò’»cP ^dÒG4¤Ý4¤}4¤`Ég4¤Ã`ÊQ°GàE–!} +ö°|CCú¬¼ÈT^ô +é¥{dþ´—îõ!R'CßI÷ÚÆüi+,ÌÔ7ʳ`™t¯w‘:ʸܬémX˜¡¿…ÔÉÔW0kZŽ‘©/aÖ´ˆYÓfM¯1kšÏ¬i³¦9ÌšfÉ°HL}š ›³ŒkØø˜©Cêd(÷–ŽÔÉPî•–†ÔÉЇÑÂ3H KeþÔÖ‡ÖK&ƒu§…%1ê"ÓÁ:ÓÂ:À½ ½=’(SO¤…µ–¹` p/C¹WXS¸—¡ÜkXC¸—¡?¡ž!VWƒÅ3“ª…$Ê {™Ê½Þ«.oƒUEe¨Ñ{`•‘Dj´,V¶Ò¸¶yDʽ>« {ÀÊË^×A0×½¬LêXY¤Õ¦r¯ã`eðmS¹×)°ÒêÎâ°Rrì!ùXŒüHãºö€\+!¿€E˯`®{™Ê½ü™Ô¿ÀŠÉŸ`Q꯸ÊJ(V™ì™TA°{å.°¹‡«Q8G\«Š’E‘ÝOV‚ìA²Rd•%+OV‘,Ž¬ +Y +²ZduÉê“5"kBÖŒ¬Y+²D²ödɺu%ëA–LÖ—¬Ù²AdÃÈÒÈF’"Gæ%{‰l2ÙËd3Èf“Í%›O¶€lÙ²åd+ÉV“­!{—ì}²d›É¶‘í ûˆl7Ù>²d‡ÈŽ#;Nö +Ù)²3dß“'û‰ìr.îó(xéTå…”P«|¨ý:?×u[½#b¨:õ.(_óÙóÜê‹«óѪ®¸ª´_³×ßÞºî£áùhx>ž†ç£áùhx>ž†ç£áùhx¾ /çëh};-gÓ ûKŒ¯°}%C•Ñü®¼åOe{Ú㜮º[›¢ž²SÕSuou¤à‰;PíR¯Ö­Iêý™ds«ÐÚ+Ëë¢ ¯‹=έöŠVM^¼ú¤ÆÛcíÙÝuÚÝuÚÝ´»0Yû +NgêWirW˜¢]â®áEîžgbvŽ‰ÙY&fg¸CxŠ»'™Ž`:vœéØQÚ˜ô9Ò1ë›vn&ö)3±ýÜùÛ ³öA‡‚}ÌLl'Íkwþ¶Ò¼¶Ð¼60ÿʤy½ËükÍk +ó¯ÕòØ›ð-CÙç°eð-CÙçt°…̺^gÖ5Ÿ–•Á¬k-k6-kÜÊÊû|`SàVVÞ·l"ÜÊÈ6š€?ëùÌM¸Æ3á˲Üô°1°,CÍ„+ Wºl ˲RC7ázž W®á°,Cöƒ +eÂ5„ ×`&\ƒäØ@~§v®T&\©L¸úÁ²,'>Ö— W&\½™põ’«`ÉL¸z2áêÁ„«;®$X–¡wcÂõ,®.L¸:3áê,EÀ:1áêÄ„«#®ŽL¸:0áêÀ„«=®öL¸Ú3ájÇ„«®¶L¸Ú2ájË„« +®6L¸™p%2ájÍ„«5®VL¸ZIYk°–Ò¬%vþ,Ö ìiìüjÔ +,ß?N^`-°óg¨Ñs`ͱóg={ &ÖLžk†?+ +övþ õ´ò"XSìüYl +Ø“Øù3Ôh&XìüYÏ7óÀcçÏÚ‡÷5ÂΟ•ZÕEª£ø +µ··¦fÒ¬2iV™4«LšU&Í*“f•I³Ê¤YeÒ¬2iV™yjVÎyÿ¿qxˆý'äÅ·´³wr¿‰Ö=Í“ÕC½oþ39ÕTÊJ¿eMlÖÜ[ÖÄe½ &зç²ÿÎí>ù¤û°ÁC†f=¦9÷ðÜ:UÐn<ç\¿Âv'÷ú‰®ë-c“ú‰ILÜ·—ºÇX8¿:š_¸ ›wíIsßÉþ½‚ø-×y§$»ó¬àlnÿÈ‚!öÏüPK€‰n:MŠ4PK×.f8-Pictures/200002180000355500001F51D15B9C9D.wmfíÚ{pTÕÀñsoÞ@ÙM–´ÁÆÁÖ¡HÀðûûkÛh%>ŠÖ*èÂFØ0!@¤<—‡ òDDVžåUÜ" +åU°)ZŠJÁ"ZŠ–‚¥@‰UÔÎöwïžûÝ$Ý»¤,þј¹sÏùœßþ²Üݽ¿_NÖP9J¥õô)ÕJ*ë_ºiF¶Ês³›‘nZ£Ö¦µ–-Ç'22ìHeZ±]d’%çÏģѨËÐÅ0ì 9ö㬑aZ«ÖÈ4 m±Uëç~jž‹Æ’Î4œgq{EÐ_]t‹¿¦¨ïÐ`ÿJµi÷žšírm¯¯QªXÿÓÎÔÕèàúüÒôóÓª—N´ý/êDgØù¼f[ÕËyÌ,£—r25éKL_טJb*]cꈩsYNÌrטÄìt9BÌטóÄœwÉ3œ˜<Ã-¦„˜ט2bÊ\cÄ\c&3Ñ5f1‹\c¶³Å5æ1‡\cˆihsF<ù{ÏzÇ%~l<¦ž÷g½r‹™JÌTט2bÊ\c⟅¶ê¿ÿ/Í?É +ùInœÉúÄ^aÈšÏèÙìN5þô7–DYJ$Ëm)gé.Y‚)gé!YjSÎr½dY–r–Rɲ#å,=%ËÛ)gé%Y>N9KoÉâ5RÍÒG²§˜ÅT%Å>ãæÔ³”øŒSÏÒÝgŒO=KŸN=Ëõ>ãÅÔ³”úŒ7SÏÒÓgœI9KŸÞ¹Fç‹~ïfÛYÒ%K×Ò}ª(ÅÏ€<›>O¨Kðlút--OáÙÄò¤É§ ¸4Ouº`žæU&^ÿœQ|µW£›¸çËTir¾Ê¾&ùéÙƇ†ó¨LÃúÑWÈqMZ†ºU=¦î°é2žnÏcQNÚ4~° ªì# ã€=O¿TÖWÚG@Æ{ž,¾½1@u°€Œö2Øóx|ìژͮM–KŸœM×зÙÈcÖªrm“ÕÚ&é‘ל úi¯îÖ6FÝ«m´ú™¶‡ÕýÚFªþÚªÕƒÚª”_[¥¤-(×,fr­cPC´ùÕPm~yEÕ`£±±Ø,„MÁj±iØ l66›‡ÍÇb‹±eX|´‚ÕÕØl¶Û„mƶbÛ°]Øn¬Û‹íÃöc°ƒØaìv;†ÇN`§°ÓØ9ìCì<ö)Šñ ñ,¬5–‹]‰y0V€uľ„u¾ŒuƮúa%X)Ö »ûv#öì&ìf¬ »+ÇîÀúa÷`÷aý1?6Œ±*¬«ÁFac±G°6 «Å¦b3°'°9Ø\l>ö,¶[Š­ÀVbk°uØF,‚mÆ^ƶa;°ÝØ+Ø^ì5l?öv{ ;‚½‹ÃÞÇN``§±³Úâ¿«eéßÕ²•S­óµF4jE6­(érïmeAíy,*qÊ•u}e´çÉâóe½Ð>‚2Úóx|Ë*ÔC×tä‘Q&Ö +kƒµÃÚcùX¬+T-»Žñß…õL—矸+±fÒWH5]$ýGl6C +“Nd°žU¨UÒ7,eV U¾½áÌ>–ÙYãâjýRjýRjýjýBu—¶ê'Úæ«{´=£+¼×œK]Šºþ$u}–¨m†ªÐ6]=¤íqÔÕéºî5“ë³)j¸¶Iº®{̉j”¶GÕ:qÚÆQáÇRáG«ÉÚFéNÏkÖ¨©t%Ó´ +W3µU«YÚªt­÷˜CÕ\mAõŒ¶!*Ì{È©úòŠÆl zNÛ@]õ­ÏìJjÚjl¶‹`›°—±­Ølö +V½†íÃÞÀ`oa‡±w±£ØûØqììv;‡}„ÇþE±4îoÜór°ÖX[ìJ,óa_Ä:bWc°k±ÎX¬Ö+Åú`7`ßÂnľ‡Ý„ý+ÃnÃʱ»°~ؽØ}ؘ«ÀcC±*lVƒÆÆb°6«Å¦a3°ÙØl6[ˆ-Æ–a+°ÕØl¶Û„mƶbÛ°]Øn¬Û‹íÃöc°ƒØaìv;†ÇN`§°ÓØ9윶–ÔÿX +™¢Z«ñbÎÌ+³\fe–ßÂÊ¢2‡¨Ì!*sˆÊ¢2‡¨Ì!*sˆÊ¢2‡¨Ì¡Ï¥2;ò,Þ‡´l¡¯½ƒ`ý¶lí Lµç±¨Ä=P¥½ƒà—³µƒà·çÉâ—Û;~9[;~{ž,>ÏÞA°î{Ö‚ßž'‹o°wür¶vüö<Ÿ¸³Èv¹’9úµ¹¼‹`ßó°Ë»—w,»¼‹pyÁ²ÿ¿]„l]CsZ°‹%÷±VòQ–Ü»Òí󼤨¬{$®ÄçÚçäñ²^(qŸoŸÇ·¬B…éUÂô*az•0½J˜^%L¯¦W Ó«„éUÂô*á½Jâëh}#%qÏ’ý¹ô.mì+™.µyô.¥oÙh]u'¶Rúš*éqËQéÒã8±ËýÕí_qbóýÅíWqbýµãRô)ëéSÖÓ§¬£OYMŸ²Jï…xÍåº;ñ˜ËèS–Ч,¢Oy–>e¾þÿ{ͧéSæÒ§ÌÖ݉µSR¡mºîN<æ4ú”:ú”ZúgWÄ#ÕHmήˆÇ|Tw,^vE<æ#ÒÍÇÌÙ±z«IÚœ]tYuÚFÒ»Œ wqvE¬~ëImήˆG:¯yÚœ]k?m¶€îb<æ yw8wçÛM~õ<ö l-öKììEì%ì×Øvì7Øìwثذױ?b‡°·±w°¿`ïaÃNbÿÀÎ` +Ø¿°O°Ï0Å]ÚäΉecm°+°ö˜ë€}» ++®Á¾‚}ûVŒuÇzb½±¯cßľ}û>öììÇØíØØÝØO±û±Ø@,€ +Á*±aØpìaìçØ8l<6›ŒÕac3±YØSØÓX[€-ÁžÃžÇVak±õØ Ø¯°—°-Øvl'¶û-ö*ö{ìuìMìö'ììÏØ{Ø_±“Øß±3Ø?µýo]ŒSk²änÓJî.érdé;[]j'ë‰Ë•£Ýb d½Pâòå(hÛ²š¡s‰Ð¹Dè\"t.:—K„Î%Bç¡s‰Ð¹D.iç[78æiöO¸ßlœÉùæÉ€šâèòºÅWÅ”DÇ\0¦{tÎczD׺ĸ}[¦ñsαód¨#†U^gÄîÜÉ2u5š®Å®_;“sý”išeåEåý+«‹ÊýÃ*ÊÝÆâL9~tò¤Ú¼cOóJ6ùFªŠw‘±WJ5î1YUz5Ùw½-L³óPKW}†ö˜ l.PK×.f8-Pictures/20000262000034EB00001F51157CDFBE.wmfµÛ œNuÇñÿ93ÌÓ í$©V +=Œû-÷KƸæ¶îÆm4îŒ-·<²R$—Qd%‹ B+¤)”lÙVmh)µ•Ýfÿç<¿çó ÍÖ3õz×üÏûüæOÇ9ßç÷†*¤TÔw(UX%*ç¿h}D±ª€þZÄ|ÈP¦³ºÅt®Åêãg½2ÜJe:µôIŒþúíÙÙÙfp‡ +†áîPÈý>ge˜ÎUge†Xðªóë^1¿Ën:Ûý.: Jï7²tJ¿ŒÒ톦÷¢6ïÝ—±S¥wÈPÊ'¿ŽéîTÑ(áùû‹’ߟ¨|_4ÕîÙ¡êî~¶y«JrW–c$©ÐN×Ö¤P“âY“FMšgÍTj¦zÖ,§f¹gÍjvxÖœ¤æ¤gÍ÷Ô|ïYSÜÕ7¼j*PSÁ³¦5-Â]LUÉ—`4‰|—J F¯Èw©œ`Œ‹|—¤c~ä»TI06F¾KÕãhä»TK0ÎçßtQã¾ß»¦ªì»¤"ß%É÷a>ìRÅ·5v©ê[’»Tóùóa—ê¾ù°K +_r>ìRÓç‹`—Xw—(ý®ó©ÛÕ]×ÝçÚçwp夡Ð*|5)GâÊý@A¥¿–rÿ_â£cKFè» +Î/]L÷FP-ÕÕÖ=êõA÷5ÅÊ«ú®|Æ ¯,s¯j-¶Kµ{[V¶ù–j'¶UV¶¹IµÛ¨:ˆ­SŠ­UÅV«Nb«de›+Tg±—U±¥ª«Øbõ±ª›Ø‹ª»ØÕCì9YÙæ,ÕSl¦ê%6Mõ›ªúˆMV}Å&©T±qªŸØã²²Í Õ_l´~m¸¼,s¨$6˜O‚ij°XýÞ Zª~ÿ­·&ÖS +ë¦FŠuU£Ä:©1bª±bíÔÅÚ¨'Ä’Õx±–j‚X35I¬©zR¬¡ò‹5PO‰Õå“iõ´X +5]¬šzF,IÍ«¤f‰UT³ÅÊ«çÄÊ©9beÕ\±{Õ<±2êE±RjØj¡XI+¡‹Ùê%1KV¶§^‹ÓÓBögì5ì/Øz,ÛŒ½…mÇvaï`ïb°÷°#Ø؇ØIììoØçØ?°/±sØìööoì'ì¿X6e„¬€²BØ-Ø­X«â\½KÀ~‡Ý‰Ý݃•ÅÊa°‡°$¬*V«=Œ5Àš`Í°–X+¬-Öë„uÁºc=±¾X?l6Š +ÇFcØØxìIÌ=MÇþ„=‹ÍÁ^À`‹°¥Ø2lö*öö:¶{ÛŒ½‰mÇÞÆÞÁöb°¿bG°÷±±ãØ'اØçØß±/±b°‰…; 1ÒYˆU¡Äá|-kdg;•W?¥£õS¢°{¤ëuº{¬Êý©^T_·Ü#]¯ÓÝó¼êãõõD÷H×ët÷<\cO}§SyõÊyjÄ +cE°8ì6,+%b‰êÆ^Çpç&t½ Çï?÷¤çœ•ˆ>£ÓÈ':ÓÏëçí<ýÊÏlµR¿®K9»]'§bFèì²>»`Ü\~:M~:M~:E~:A~:®SgÐ> ?½/©É6ß#+’•mî'+í“„d›»%!YæNIH¶¹]’¥“Y7±Íä¢LIC¶¹^Ò¥“Yo±5’†,ÌúŠ­$­ -“÷˜¥“Ù@±E’|,s!Ég¬lsžd Ëœ«›-ÈÒ-”†ž! +M' +MQ#Äü’‹ls¢-6AV¶Îhbcee›£HH#ÕãbC%+Yfº'6H²’e 5¥’šúÈÊ6{¨ÉbÝ$?ÙfÉO–ÎhSÄÚK~²Ì¶$©V$©dYÙfsÉTN2›I2›E2 ¥«º¤«Ú²²Íêêy±ª’³l³²ä,Ëô©ÄÊKÎrú§¡ÄU–ÄuŸ¬lónµHì.É^¶™(ÙË2ïPKÄâU(……ò˜s¿ Í+âÔ+Ø*l5¶[‡mÄ6a[±mØNl7¶ÛÂcÇ°,ìö1vû û;‹}Ç.bßb?`?bÿÁ~ÁLž7Ñ<ƒb±ÂX±kR˜c6Ý%b¥±2Øï±û±òXE¬2V«ÕÂêaõ±ÆXSì,kƒµÃ:b±nX¬–Š +ÄÒ°!Ø0l6{‡MÂ&cS±iØLlö<6›-Ä–`/a¯`+±ÕØl¶Û„mÁ¶a;°ÝØl?v;ŒŲ°°±SØgØì,övûæÿÈ^Áç÷Óê}·ŽV¡3[ŸåìN}ƒ©ÈO*ò“Šü¤"?©ÈO*ò“Šü¤"?©ÈO*ò“Šü¿I* +Mè gÀ능¨÷u6ÉÒ_ëô”åž«rÏŸiú‰˜®Ÿ{ijšNSÜó¼ê—»1çyátÄâÜó¼ê‹»1瓦Ó‹sÏóª¿èvÄô½ØíˆÅ¹çáúÜS]¬Ç+YHþl²HuY¤ºc¤ºÃ¤ºC¤º¤ºwIuïH/Ì2w‘ê¶K/Ì2·ÑÛBl° +tÀÖÑ[Cì5:`¯’ôVô–‘ô–’ô‘ô’ôæIßËÉh¡¤7›n×,º]3èvM§Û5…Ìç§Û5‘n×Y9m(m˜ØhòÝHòÝPò]:ù.|7Xª¤:ËìK¾ë)©Î2»K/ÌÉhÅ:“å:H/Ì2ÛÉ{Ö6[“åZ‘åZåš“å“åªbõèŠÕ%ËÕ$ËUWÏŠU‘þ˜¥ÓÚóbÉmåÉmå蔕%·ÝCn+Cn+EnK$·•”´f™ úoYÐ,µL¬¸¤5›´æ>[°ÕØl¶Û„mÁ¶a;°ÝØl?v;ŒŲ°°±SØgØì,övûû»ŒýˆýŒý‚)žUÑ<« +b…±"X¸g^ÝÆÕx¬–ˆ•ÂÊ`÷b÷c`1V«†ÕÂê`õ±†XS¬9–Œ¥`í°Xg¬+Öë…¥bý±4ì1l6ƒÅÆa°ÉØSØ4l6 ›ÍÅæa ±ö¶[‰­ÂÖ`k± +ØFl ¶ÛíÄö`û°ƒØ!ì(v û;ÂNcg°/°¯°¯±o°_wÏb%¿ºîYŒ¾ËÖwµ}‹v¿.Èó駯[º.ζÜó¼êKêëÎ]³¤®w¿æ¬¿±t 'ȉrb€œ 'ȉrb€œ 'ȉ\rbó“w¹çÅØß$7q_Éh‹~Ôéçq×¹½ê¡Ú4}O×÷óúH“{½Wírýl^¡³åR},÷È–¡ÚâF'»ëœØÝ]çU{Ѩ®sb]ëºëpíÍeÄ+dÄ+dğȈ?H2´Ìï™’^¢Ëw‘‰èy²ß9²ß—ä¼³ä¼3L5?gªù)ÌSL0O’ߎ“ß²èÔ…WÇHmGHmïÑ•;HWn¿d5ÛÜ+“IËÜCBÛ)¹Ì™‡Ú[tÛ¶ÒmÛDË$­§³¶ŽÎÚë’Áœ„J^«H^+I^/“¼–Ñ1[BÇl1óȤ¬ùÌ#çÒ›£æ‹=K¢šE¢šA¢šN¢šJ¢ +¯¦È<Òù”÷ªØd™GÚæ“’¨œ)óZ±‰’¨œœ¼Qlœ$*K¯Þ{Bæ‘Î4úm±±2´Ì µWl Ùj ÙjÙj$ÙjÙj8“ÉaL&‡2™Lg2™Îdr0=±ÁôÄÑHOl=±þ2£´Í~ü¼qªÌ(mÞ¯ˆõ‘¥3Wòé%Ý1§ÿZP¬»tÇœiy±nª¨XW~^¹«²ÄºÈdÒÒ«’be2é|.¸K¬“L&~î}X9±ŽêA±Ž2™t&ò•Ä•É¤cÕÅ:ÈdÒÒ«ºbíe2iéU#±v2™t>´k+“I§œ‚…RVRVRVRVkRVkRV +)+…”ÕŠ”ÕŠ”•LÊJ&e%“²Z’²Z’²!e=BÊjAÊjAÊjAÊjNÊjNÊjFÊjFÊjJÊjJÊjBÊjBÊjBÊjLÊjLÊjDÊjÄŒ²3ʆÌ(2£lÀŒ²3ÊúÌ(ë3£¬ÏŒòaf”3£¬ÇŒ²3ÊzÌ(ë2£¬ËŒ²3Ê:Ì(k3£¬ÍŒ²3ÊZ7™²BÏÂ}*¬ï8Ñúˆ‘»‘×sÓùüg麢úˆ»NmI}=Q×Åë£äUµ7öLÍ$Ye’¬2IV™$«L’U&É*“d•I²Ê$Ye’¬2ó5Y¯‡ÿULУÜ_!?~=çN¡Ÿ²ë“áËî«ÿÜÂWr«©”=îº5•³_¸nMRöZ¯Ÿ Ìù{.äîS@õ=bä¨ìà=<¯*W_ ¾~EÜB¯Ÿ2M³UûÒí{Yº}¿ƒúë{ŒÃõQâü×êÍ]û2B’Wý[ N¹Á?)•3sUÉÕ¼þ•“ƒQî÷üPKˆU\ Å +f5PK×.f8-Pictures/200004190000356F0000214816F2BAAD.wmfíœ tU†oU«H·£ÑÁ3Îx&ã’•£(›l²Ä°(¢l†%B"AQTŒ "(¢¸ÃEDÙ÷EAv‘ (ÍÜ÷êÖß t51œÏ©Sï}õç»;}¿~uƒªµŠ$ªJ¤þ æ#È¥>W7!¦U3ÕµP>~å‘¡“dªì +<©ÌçÓÌ‹ŠŠLk… C¯PE¦ºªF¦a³®ªïûóx‘µèÃþW´ëÓ/u@Ö©ƒëܕѯ[:Í_µzðR>ê,]7˜(J¾©WºÑ¸Üñß$ÿ>¡òuÁHëÿŠìtˆ^Ïm^B‰zä2¯0É^éÌL +2)Ž™ d23/ ó‚c&™\ÇÌ +dV8fö ³Ç1ó+2¿:f ;f8eb‰qÌ´F¦µc¦2}3Ñ„Ì$ÇÌ"d9fv"³Ó1s™“%2?2÷ÿÚS¯8ß_ëÍœÆëó49eö ³Ç1³™¥Ž™ÉÈLvÌ Gf¸c¦2½3-iᘹ™ë35‘©Ig?þg¾ûœ(ã»Oñ•Ô»Ì5!EÕŒ4Îx÷³FÅß±Š_«Dó*w¼J ¯’ð*±¼ÊÈ€W‰ãU¦¼J<¯²<àUêò*»^%W9ð*‰¼ÊeF «ÔãU¢\Ťè¨H£Eà«DG©¯i |•ØHc|à«ÄEù¯il +|•º‘Fa9<ÓuŒÈ_»&ÅD™å°JlÔ +|•¸¨Õå°J|ÔôrX¥nÔ å°JBT¿rX%1ªm9¬R/*&€UBõ*Aüª‹"7]{ÎuŠûwI“²GÞ«‰¨ø' +ߟ*QŸ¯Öÿ/aÁW?öWU2Ô·®ÉǵA!Ô–6S}ìàñ=·Rö'–’ù¾4‰2õ‘Ëã\=÷—ŸÂŸfèãa?¬çþò.£…ë£5[빿ü1ãFúEq<ŽÓsoÞzlÌ3›ÊŸšBåQÝ*Ÿq¼#—ù9µö?VóPGaèa먓°UÔYØJºOØRê"l1uö1u–O=„Í£Tas©§°¨·°÷©°™ô °üLXl¥ ›Š‘ý¨»MõÌYl" +6 Oƒ…½I {ƒö=)l=%ìezFØ.ìEzNØhz^Øó4ZØsô¢°ô²°á4VØ0zMØSôº°'è-aCémaRŽ°Gh¢°A4Y˜zY,Ÿ!ûÓtaÑ{Â2è}aé4GX?ÊÖ—{>–F‹…õ¡¥ÂzÓJa½hµ°ž´NX*mömÖƒ6 ëN[…u£íºÒ.a]èKa÷Ó^a÷Ñ~aé °{é°NtDØ=ô½°»©PXG:.¬ý,¬=ÖŽN K¡ß…ÝE¦¼ÿ$S°a±¶*¬ +UÖšjkE—»“z-Ö’.Ö’²-Ö‚®Ö‚þ +v°æôwaÍé:° k¦ßkkFÑ`±ÂšR‚°¦TOØt«°;è6°F`M„5¡æšP añy½1µkÖAX#ê$¬uÖº +kHÝÁz +k@½…5 ¾`éÂn§La·Ó@°G„ÝFC„ÝFO€=%¬>=#¬>v+v+6VØ-ôš°[è +aI”-,‰&€ý[ØÍ4EØÍôØ aõh–°zôØ\a‰4OX"}¶PX-–@Ë…Õ¥ÕÂêÒZ°OÀ<Ââi³°xÚ",Žv‹£]`»Á¾K_ ‹¥o„ÅзÂbèØ¢©P˜÷ÓweùôJvUVç댢"•,YÉ‚)žªê#‰ÇIzn¥|W¾|Ý¥$'鹿|_ÐG“ôÜ›/]eT»‚%G깪V¬:X-°Ú`a`—ƒE€EPéGïî†}½’ÿ߷ +©ÙåÁ;¹Šofï±f¹\'r-µfƒh&WÎ)2kCW°¸ kO§Ø5ŽÊ1Ö—»c<ÇHõá½ÏrŒéÅ£Ì"fÑf‘)l<Ì"»˜Y f;†›}Â6‹Wac)K˜ínö Û,FÁ,FÒ¨³Ìb8Ìâ˜ÅÓ4î,³êÃ,†Ð„ófs0‹U˜Å¶2›Eg*(³Yt _Êlm©Ê5‹HXÄõ0‹(°˜E]˜E"Ø-°ˆú0‹†`aÍ*Ìâ¢2‹%0‹e`«`k`À>…Yl‚Y|‹Ø‹Øù?4 «:µ§jÔš™=só¬fWñ,¬”5?5?5?5?5?5?5?5?5?5?5?ù¼Ô|û­b^Ã)ݾHŠÞQµYí‰lÕs+åÛ®2HU½É|žÆUr²žûËçê=UCTEÉÔsù0½'Ò’ÏjO¤¥žûËŸÔ{"Ñ|V{"ÑzîÍûv–P‡G²J…³T8K…³T8 U8‹Å*œ¥,Î*»J)vC*S/6‹4>÷ãTšž[)ßõ®_wq®çkè³ÿ|8_à\8çÃô¹x¾tõ0 +f”3Jƒ¥ÁŒÒ`Fi0£4˜QÌ( +f”3JóaF¾GÕßåÛBÏ‹)U×d0›À®ü…lI…zìëQ·³4›ëì|®ÉóõØ_6—bCĵkûˆÍù´ +¿Ã¶ÑcÙ“ÆMlFñlEñzìÍ–ÍŠŽÂŠŽÂŠ¾ƒ}Kí…ˆ¹Í¯énaûÄTßҽ¾?r›;è~aÛeäfßê*luæ)}SZ‹;H«qiLiî -‚)-”‘Û\SšSš#π˜ +SšE…½Çk±ôˆ°wèQaSå’2¯¡Â&Š3¹Ì&,÷’Þƽ¤×aO¯Áž^AïàXñ(uÏiŒ°ÑâQʲ^eƒe½ËzCØ0ñ(—ù$ö8î/=F¶Q=£££Ê„Qõ§waY³„eЇÂÒaTý`T}aTÒ"XÖa}ÐãØFÕ FÕF•JXÖgÂzÐaÝaTÝ`T]aT]è+XÖ>a÷Ñ7°,Û¨î…Qu‚QÝC?²Ž ëH?Á²l£j£j£J!C*F +IÅH¦Ê°,Û¨ÚÀ¨ZèZQmX––u¹°;é +XÖÕ0¯:°¬kaYÿ³ª9Œª9Œª9ŒªŒªŒªŒª)Œª)Œª)ŒêÕ0ª&0ª&0ª&0ª&0ªÆ0ªÆ0ªF0ªF0ªF0ª†0ª†0ª†0ª0ª0ª4–õ(,k(Ø“°¬,XÖp°çaY/À¼^{–5–õ:,ëmXÖx°I`“aY¹0¯é°¬÷`YïƒÍeåÁ²òÁ>†eÙF•£J„Q%À¨`T 0ªº0ªº0ªxU<Œ*F£ŠƒQÅÁ¨baT±0ªXULÊ®{•ù·*àÄ=¶¾kd-¾îâ\ +>j#Î×#8ÆGx‰léêg,* •‹Ê‚EeÁ¢²`QY°¨,XT,* •uA,ª´7AF}T1ÚêÃzßsî¸9ÂW…<.Ôsù)´™½I;x¼CÏýå]Æbv'u¬äñJ=÷—?fÌfRÇ|Ï×so¾lwÃ*)gŒ\fˆa;”iؾd¶/ýŽ]¤ßàF¿Š¹ÌSbDnógxÐI1|·yŒ}ßb…pžÐ+ãçq³ÏÙ¦s¦sXüÆÅŽgï `Oè ö„¾ÕàŸ‹í§‘Âö‹Ë¸Í½ô’°¯`0»±ÿ³[úbÜæØÿÙEÙÂvÐDa;¤Ëmn£©Â¶Ò4Œråêš)l‹ìÿ(·œ-ìsÙÿq››ÙÔ-¶™ò…m¢…Â6ÉþÚý[.ì3Ùÿq›i­°´^˜Žâ£| +GùŽò eev}Öc×g=v}Ö¡f}'l-¶FÌÄÅ£ÂV‹™(G>ö›°UT$l¥ü„ªËy^!fââQ5aËÅL\<ºTØ2Ùëq•ýW¯»JØRÙõQ¿ð7°ëÀþ vØM–HŒ‹Gñ`õÀ’Àn¶˜[,=0Š5k Ö +,YØ"J¶ˆ:‚ÝvX°ÂRª°…øMþ–Ö_ØÇô°°ÅQ{ l(Ø0°,aѳÂ>GQl4ØK`¯€–Oo +ËGQ,lØT°\a h¦°â(ŠÍ›6_Ø|q7-[¶ +l°yâ(jŸ|#Ø&°­`ÛÁ¾–'ŽâæÑ>°¯Á +À¾6—¾6WE±ã`'β•?Ö +ó&W~uäð8GÏ­”S7Ì›l,êÈáqŽžûˇñõ}äð8GϽùÒU­l˜K6Ì%æ’ +sɆ¹dÃ\²a.Ù0—l˜K6Ì%ûwÃT5:ò»Ý +SHè0ºavrÍØŒn˜Uüùj1ºaÐ)ö€²vÃVÿí»H¾êÿOÅ꿽Rè£þ-VõíÑ÷èš="½².®úvýÿõÿÜRõÿ‰³êÿbõßÞÕØ/{jÈ®ÿ_«ÿcPÿ_öå9꿽[Qúú?õÿ]ÔÿPÿ?DýŸ‡ú¿à"¯ÿöÅ:ìQ¬ÅÅZÜõYƒ»>kpק¢þWÔÿóSÿg Ö¿ ö؇`óÀ ®/D­_ ¶l%ØZ°õ¨ëÔúÏÀ¶€mÛ…ºþ%jý^°ý`Á}‡ZõÿX™ê¿UCò©¿ïØ=+ùäæY +Ì®âYi{VòP™óP™óP™óP™óP™óP™óP™óP™óP™óP™ó.žµ« *¨ÚUPgÿ; \Û3IU¹¹Æ¯çþò¹zWAÕµ«°UÏýåÃô®Â2>«]…ezî/Rï*Ìå³ÚU˜«çÞ|ÙîÎT˜E…YT˜…Å*Ì¢Â,þ?Íâu–làúïáó&NyôÜJ9u–l çjq¾†>ûχóõÎ…s>LŸ‹çKWµ<ðüÅñÀ_<ðüÅñÀ_<ðüÅó'è,¹„}æ2v™ËŒytî,9Î.sŠ=æ”ûËæ»;âä0ÞÎï'ñv–x‡»Ô†»Ô†»\ +w©itVîRÅ°Ý%Ô°Ý%Ä°;F‚ +»cÄ0ì>Z2ì>ÚßÐrÝ!¿ ägt‚œDÏì üñ1ôÌJÿ‡º£bÿñQt}‘^uåia‡ä®ˆ²g…D‡Çù½aÕ5cwxìCì^ÜÙƒþØÝ°˜/`1;ɾ?²Ó‡Ål‹ù³»Ëtn¬GçF…»\lîÒì~°îp’à)½ÁÒÀÒÁ'Oö8ØS`OÃIFÀIžö"ØX°Wá$oÀIÞ›6l +Ø´ +w)£»x{8pí?̉Ãzl%œz8°·fg9¬Çþ²á|=‚sa|„—È–®RÀW +à+ð•øJ|¥¾R_)€¯ÀW +à+åê+Öuï_n´xþåñWÒŠ¯dÿ%˜îƒ£Š¢ùyó^ñ•‰.jqÎLLQsfb‹÷› æÌà¨qçÎDÏ:w&f͹3±{2Ö#vö_Ó)þVÑë„P÷‡3 ,ªoXÝ€þVºÑ(yÍz>«ë•ìç“LÓl•R'¥[ú€:)©™}zÒHÍ+ñqçáÔ¿lõ`û•Uâï’×e­W7]\%¹êï/ƒ*¤¿æ¿PK³Âž‰šTPK×.f8-Pictures/200000BB00002F1100001DFBAFB5B668.wmfí\oˆUE?³²Ä4Ü0!ƒÝ­¬5SY%wÙ?¸¡Rd›D¦°Q«¼ +I£4×V’ØbA¢?ä—]PB00S,7¢4j—óKôÉ )ƒòC` ÂvÎÎ9Îy÷¾?÷²÷ú&¸‡3ó;3wÎ3gÎÜ;÷=9piÌ4W¾c1Àµ{êW=¹ÀÀ– +WÔ@~Ç6Hob~M@6®£Ê·qYÚ܉ùH·#Íæ<©Ð€t+äË@šËrJüýï$¿_µ›4 Õ„ZÕïÄÄÄz$«FZ‰tË{°q½±m#N˜ÈˆW)¹\oÀÛªkk‚IëPSF‡R}‹\Ýû +LıŠ¢”1”6{™jV¥p¡ùJžÔÓ¡Tß"i±÷soRßó‡Î»`l†°¥€NY²iXÛÌešÁ¸ØŒÆø¤!¤%HÏ#½„ô +¸¹ +JFë­)…æA/Ò:Ø;&mR«áq¤§&× +²á-L2W§)^ þøÎ °óP|_°*Æö*~BÉ“ôB:”ê[är½éJº·Ì§’KQ}ê-¤eH!mDºù>%2òb>õR¼ +ýÊŸÈ_Èj¡´E‡«w~š‡ ‘†‘Àƶ–±¨>K}$ï³í`}aÒÒ ë/ù½¬çH NT½©Ï4ô&??ˆÔté]n#ØAÆ.+ޯ䙟§Ÿ¢úy/X»¼ƒtéÈ÷s‘Qýb~N×ÙŽ–ÝvevN?Eµ3Ù—l9 +a;‹Œ°bv^‹ôBàú™mÓKq|ø$XûýaÛŠ¬œï@~\|Î|øæ¤8>Lö%[žƒ°E–ù°?)ªmi k¿?!l[‘‘-ŠÙvÒNÈ¡EޘܳÓÞ\ž[«!Ùý5íM[Àî¥[À½ÿИûÔÃHÍH‘:¹`‡»¨x³’gþ‘~Šã>AjCúé1È÷‘eûT?SœGö%[ž‚°E–Å8RTÛ¾†DoRÈ~¿Aض"£x-Æm +Å8Ù»&çzÀÆ´pqNc>Ĺ#@ï¯. mâ6‚aì‚âë”<ó‘ôSœ8÷)ØóŠ¯!|–!²,Îù™âÄ9²/Ùò;ÛYdYœó'Åy–#›’ý~…°mEæ˳‹ŒƒgãàÎJ4æËYÉ·`ÏA΀;+9òq.ë:>Äæ£H§‘Î#å6‚eì¼â§•<óëôSœØüØ÷l§~†|¿Y›ýLqbó)°¶ƒ°E–ÅfRœØü=XûýaÛŠ¬\lÞ¦b3Å!›k ÙØ|]QUÌ—ØL_6QÜ5ÆÅfÃßû\ç²®ãCl>„téáü½’`‡»¤øU%Ïü:ý'6“]h¦|A2“ï×"Ëb³Ÿ)Nlþ¬-¿‚°E–ÅfR&›’ý(m+²r>܇֠ß"Ô‚[ë3;§Ÿâ~Ç@¶¤ï‚vYæÃþ¤8ûk²)ÙïwÛVd¾ì¯åýVqツX}Ñ÷Ò{^´›¯[ÍظÂv›xgJiî雌}—¶Ü¸÷m’ob}—ê$e—xF;w b>Œý–j=òýÆƯ•ßÃzîÔñAӘÒ[c=\îU¸Ïk Ÿ]wÎ)ØÆŽ(¾Nɳ8‘~Š'h?hì9Ù)xF"2²}©=@^¿’Z{ÈoéûµQã¾m b¾øðR°þÚ·ká²®ëƒû}Ý1ã¾Él˜±cŠ7+yæÃé§8Ïk#Æ~³sÜ„¿çY¹ç5òá­àöxIù2í¹úÙö1¯.€í øt{JºÞ½jýb>¬¼&,Që‡ÆZ¸¬ëFÕ;­ß¹’.9c×þ>ä/³Þ9Î÷ñÞEê׶Zw±íÍê»Ø\–ëïc^]“=gR}þöz UŸòÝ[PæÃœ~ˆ÷ª­j_«±.÷*£ ŸÛÖÆØZÅ·)yR¾YHÉ·).utÝJ!Ùþ cÿ‹…tâû’<ÉÞã²®“”oN¥ïJÎ;z.¡ÿž ³£Ÿ¸`uŒ5)>ªäIÍ»B:H¾Nq©£ëVz Éö÷wþvŽïKò$;Ëe]'©y7•¾+=ï®°NÓ›wW˜Ö¤ø%OrÞu|âRG×­ôŠí +O­q¶§<ɪY¦ë$9ïâöÝþ=ƒÊ; y΢ròz^£g1Fÿõ5›ew1Ÿ§êîb>P†r»!¾Î_wˆûT:UúÔç±Iëôa¾~›qï ƒ˜û\×EÆýGäeLêè¹%_lžÍäz”æpþ?PKˆÑIØlXPK×.f8-Pictures/200000AE00002F1100001DFBD4204EDD.wmfí\oˆUE?³oWk±-Ú¡?èfÖšd¨ä.î.n¨Ø&‘m°Q«¼)£ÖÒ6#*‰ü_ôƒ``¦hnDi”Kˆù%úd†¤Aí‡À@¶svÎÙ9ïÞ÷ÞÞËÎÝ7Á8œ™ß™¹sîœ9sæÞ¹ï(‚Kg +À<ãÊ·-¸q7ÀÜÕO¬0põi€uõPš†±M Ò›˜_‘5ÒuTùf.K›;0? é¤Û9O*ÌCº Jå÷#Ía9¥«ÿ;ÎïSí Ý…„jBƒêwlll¢É +H«F¹¼ Ï5¶`Ä ñ:%—ëÍxçum­C4iê'Ñ¡Zß"W÷>¡ƒI8VIôO2†Òf7SƒÂê.´@É}a%ªõ-ò§Ö{?×ñ&õ=âü¡¥`3l€—Ëè”'›fƒµÍ¦YŒ‹ÍhŒq÷BziÒKàæ*(­´¦”›ýHk Öáçbîq¤'a|.·›ÉTˆðŽßœ;Åï«cl·â'”ܧߔӡZß"—ë5*èÞrò—’úÓÛHËþBÚ€tJýIdS+ùÓsHÝð + *oi€¸5@úy¸fû·±y¸iÒN°qm'Ë¢XRŸ¥>üûlX_x i?Ø5¬^åw³žû#u’êM}f¡7ùùA¤A¤kHïsÁ2vMñA%Ïý<û”ÔÏûÁÚå]¤ãHC©Ÿ‹ŒêWòsºÎV´ìV°ó@(·sö)©‰È¾dË!ˆÛYd„U²ó:¤"×Ïm›]JãçÀÚïGˆÛVd“ùðèÁ/‚‹Ï¹OOJãÃd_²åˆÛYd¹‡“’Ú–Æð'°öûâ¶Ù¢’mŸEÚE´Èëã{vÚ›Ï`*€ßý5íMÛÀî¥ÛÀ½ûÐXûÔÃHK.#uqÁ3vYñ%JžûGö)MŒû iÒWHA©ˆ,ߧ†™ÒÄ8²/Ùò4Äí,²<Æ…“’ÚöU$z“Böûâ¶Å«d1nK,ÆÉÞÕgœëÓúÀÅ9…çŽ ­Gº„´‘Ûv„±KŠ¯WòÜG²OiâÜç`Ï*¾ø9†Èò8fJçȾdËï!ng‘åq.œ”æYŽlJöû +â¶Y(Ïrt.2 6ž +ƒ;+ÑX(g%ß=9î¬äˆ¹¬ë„›"AºˆtžÛv”±‹ŠŸQòܯ³Oibó`ß³FúJýZdyl3¥‰Í§ÁÚò,Äí,²<6‡“ÒÄæÀÚïWˆÛVd“Åæ›)éØ\~c󨢺2X(±™¾l¢¸kŒ‹Í†¿÷å²®Bl>„té +áü½’`‡»¢øu%Ïý:û”&6“]h¦|I2Sê×"Ëcs˜)Ml> Ö–_CÜÎ"Ëcs8)“MÉ~ƒ£¶Ùd>¼ +­A¿Ch·ÖçvÎ>¥ýŽlIß1Dí,²Ü‡ÃIiö×dS²ß·­ÈBÙ_Ëû­fãÞ}E1}Ñ÷Ò{^´ƒ¯[`lXa;Lº3¥,÷ô­Æ¾K[nÜû6É·²¾Ë#u|ÙåS‡!ãÎÝ¢XcD¿£êE¾×ØøU¯ò»XϽ‘:!è}Šu:«ôÖX—ûÂóÚÃg—Æs +v€±#Š¯Wòc¿¯;fÜ7y‚ícì˜âK”<÷áìSšçµýÆ~³sÜÄ¿çÙdÏkäÃ[Àíñ|ù2í¹Ùö0/”ÁvE|ÚÇž’®w¯Z?¢XëG ¯ «õCcm\Öu“êÕï\I—¢±kÿ6cë[ÏØ&ÆúTÁÓÚVë.¶®¾+Íe¹þæ…2˜ì9}õùØë-R}ÊwoQYsúAÞ«¶«}­Æú¸Ü¯pŸ~O¿×l2î7§QÌg_DôŒªÿÃAcµöUŠõä Á®¹«¹`EÆ_¨ä>|¶šÕúy­ÇPÖœN䛑¯·æ¬d¬KÕÜçz—¶ïy`¿WªåØ­`îûÿ0ϨÍ./Fþ¨¡ß¨ÜÊŸe,kgÞ¥ê.eÞ6 ïävÝ|n¾n7÷Ó©têd];˜w1oáûÁ{Óÿ[3UÛþŸÆFÆd%”Ω©®Ÿ¢O¯q{´(B<{†Ç•|Köhkã²®[ë5kÛµyòÍÜF°vÆzïQr_ë~%ªõ-òZa¸= ùJ‘ï«ó„mTu÷µîOGß•|“lBû´^ãÞýF±P|“öEãöšëãr¿Âk=¯È/h/:€|>ò¸`MŒÍW|@É}ùf9$ߤ¸ÔÑuk=†dû{Œý/zžÿïKò$û€ËºŽ/ßœJßµœwô\Bÿ=AgG?sÁškU|HÉ}Í»r:H¾Yq©£ëÖz ÉöärþvïKò$;Ïe]Ç×¼›Jßµžw#¬S£qón„9a­Š(¹ÏyÕAòÍŠK]·Öc(¶7<> +ÆÙžò$+°L×ñ9ïÒö­Ÿ—’ä+=k5q=J³9ÿPK\Ýn€èTPK×.f8-Pictures/200002180000355500001F51E30B6F10.wmfíÚh”÷Àñïóä×E“šš—°¸¥¸Q¤¨‰6¦¡ŒQÆ(ed¥ÉºÎ–¶Óöì¥éEbt™¨î´6fšþ˜ëmê2#Nl±r¨´b­Ø¤ˆtb‹ E¤ˆëÄJRZ×Ûçù>ßç}—ìžKðì'<<ßïëû¹OÎç~|>÷½³T±Ry +A¥¦¨ZåüË—#Ï +¨9—Øs­|ÛMµµ€ÿ”‘¥#•íÄΖI‘œÿ%žH$l7ÃlËÒŠõ휑e;«Îȶ,cîªów¿¶GnÒ—,ï^ü´=ê®ûI¨§®uidQ§:|꽞wä¨{g¨G©zówliŽUí{ÿòÌý3jn—O´þ—ð¢ t¾ +{šjÒ£r»ÈjR^¦ñ1­Ä´úÆtÓ鳉˜M¾1ƒÄ úƼKÌ»¾1ÃÄ ûÆÜ æ†oL¥åÅTZ~1 +Ä4øÆ´Óâ&&쳞˜õ¾1»ˆÙåó61oûÆ|DÌG¾1£ÄŒŽ‰ù\<ósÏyÆ¥¿m2fˆççò‹é#¦Ï7¦…˜ߘäkašúïÿËøWòèM¾’S39¯Ø; +,U[ÐZ0îÄ¥¾úS%]–ÉòPÖYæI–HÖYæK–Þ¬³Ü-Yöd¥Q²œÈ:ËÉò·¬³4I–¯²Îrd©°²ÍÒ,Yê³Ìb«†ú õ@öY‚ÖÓÙg™´ÖfŸe~ЊeŸåî u$û,Aë¯ÙgY´>Ï:Kó=¥Ö¬›~ît–|É2§ñŒªËò5 ÷¦ùeu îMóœÆ¶,î›'O^õ•jæ„yÆW™dýóFÉÕ¦”›¾ç+Tyrþ¶¾&Uùë Ë»U¡åüéÛäøn^zP½¨ÖÇoÑs7ÊëQÇÆw¨ÅªKa‡õ9@×Ð:nTn÷ª6c/¨ŸÛ`Fö:µÐØZõ¨±Õêqc«ÔÆ~¥~aì—j‘±nõ´±.2Ö©ž1‘kæZ»\k×Âê9c!µÔXHÏV`=Ø*l +¶‹b±^l3Ö½ŠmŶc;°Ønl–íeu?v;ˆÂcG±cØqì$v +ÂNcg°³Ø9ìÀÎbbç±±aììö)vû »†]7–ü¬Vd>«”WóV"áDŽ­(ùòÞ;EGôÜJ_Je½\Gô-;;}zîF¥ï:õBHÎÎBHÏ3Åê„œ„žgŠ¯Ô;Îûž³ƒÒóLñ£z!$gg!¤çÉøôEÀçJ›Ç&·‹ ßó°Ü.BnÁ±Ü.BnÁ±ÿ½]„€©¡Å“ØE(’÷±)ò‰¨HÞ»òõy{Æ +T&ëåW&ñ¥úœ9¾FÖk%®Fâ«ô95~r*F¯£W‰Ñ«ÄèUbô*1z•½JŒ^%F¯£W‰¥éUÒ_Gç)é{–À7Ò»”è+™/µy—ô.ƒÒ· êqº«îÅvJ_Ó%=N‡>=Ž;˜ò­‡_¿âÅV¦|ãá׫x±£)ßvÜŠ>%·’Ûq-·’ÛÉ퀘ÏØÿÇÈdz¯Â©7¥ö‘ˆ#zìF¤¯Fe²^.q¥r”M[#ëµW%G͘ØÉUª8ýJœ~%N¿§_‰Ó¯ÄéWâô+qú•8ýJœ~%~Kûw=ù‹`×óô_¸¿LÍäýÞdqO}â)yÜ’+éb«'Œ™—Ø:aÌüÄë>1~¿‘I½ÏÅ:OZ¼bY÷òÄ]V‰5Q¦9ÖØ5÷ú•èLÞõS¶m·´Õµ-êì®k -k_¢6i/”£úWGO¼×ã=’c~‡ª’½£ûH©ÔÎ’UeV3ýÂÛÁ<}›ÿPKõ +üê3b.PK×.f8-Pictures/200000A400002F1100001DFB1A0425AA.wmfí\ohEŸÍ{¯µ¡>ÅH)ø‡$Æj XHÅš£1¨ÄKŠ¦%RE#6ÕÖˆ¥"*B +ôƒý’@ó¡P!Ö–j#¢©h‚”Ú/â§Z¡R´‚öƒ¡âLv&7ïîý¹#w}+ÜÀ0{3»·sûÛ¹Ùw{÷ ‚G3 ÁxÇ7o¸v@ý#uÈ>°½ …4‹m‘_ÇòVŸ­–ΣŽWñ±´¹Ë«‘oD¾…ËäBò +Ph¿y-Û‰þøûßEy·j·ùvdtrªß………¥zdË w"ÏóñAl\olÑ‘$ØHÖ(»œo%À[÷ªskü¤}ÈVð¡\ßbW×¾äƒ 9Vaü3†Òf”9§t5J/¼NÙãÃR>”ë[ì8­a«±×3‡©¯ù#/;`^€ðRŸR²´,6k™W³^0£1~ùäûŸAÞ…ü"xs”îtO)6» zðŒõXêF~çÒb»•ÌŸ\îÄÍ)°sPâ^t5¬Uò”²Ç7Å|(×·Øå|µÊº¶4žâ£°ñô&òýÈ!ï@¾…ñ$6Ê©¥âi;r¼ #*š$^rŒ£DŸ‡]û¾ ÌÃõÈcÈÀæµlóëÂÆ,õ̶…7ÇÁÞòª<Ê~Žûê„õ›úLÂoŠó ää+ÈïrÑM°îŠ’#ÊžÆyò6ÎÀâò6òIä¡0ÎÅFõKÅ9g"»ì<NqNžÂâLLø–SÄYl¤+…sò³¾ó§Ø&GQbø4Xü~€ ¶b«ïa?^~NcøúP”&| ËóÄYli »Ca±¥1ü,~B[±¥°}y ""¯.®Ùim¾‚9ñ®¯imÚ +v-Ý +Þ³­saz ¹ùòn#ºc¬»¤d‹²§ñ‘»Wñ5÷1Ä–æ97)Jž#| Ëï ˆ³ØÒ<çEù-G˜~¿B[±¹ò[ŽöEfÁæ³YðöJ´Î•½’oÁo¯ä,ÛfùX×q!7G>ƒ|ù·ÝqÖ]PòŒ²§q”‡Í»YU>È~öÕqÁïÓìÓŒò[ëúùx@é]øyÄðž«ñögEw„u“Jö*{šß’§°ùrÓ„±û7„“oGl„}¹µË ì^ÊiqÝ{(né½»)㽓ç×¹ÃÁÆkx1,ºV>Öu]ˆá1cß ¨ò·Öµò±®[Íû¡øÝcìÚk§±ÿeÝ.Öõ«:¢_îý&{û.ïrþC,3Etò›/®>ÿ{¾‡UŸò¾¬ßæÂœ~ÈØߊ4ö|Z×ÏÇJgÜÓwÞyã}«î×ÅÙ1=ÛÒÿý¢uÕŽUZkwâÉò`óR3·]'ë¶)™Wö8b¶œåú{µÇ°}©GÙ²I®‹ËݜߥŽèãºß-§ïjÎ;Š·a”M(?à6¢Ë³®IÉaekÞóAÊy%¥Ž®[í1$ìï4ö*îBù>_—”Éöë:qÍ»åô]ÍyG÷^ú.ŸžOÿÄmDWǺf%§”=®yWÌ)×))utÝj!aO1 ÏøÏóuI™lçøX׉kÞ-§ïjÏ»«ìíå”®ŽuÍJ^Uö8çß)×))utÝj¡`ox|rÆÞÊdË°M׉sÞEí[?O S.õ,&ÏõˆÖpù?PKIÓ$@RPK×.f8-Pictures/200000B100002F1100001DFBDE17B70E.wmfí\hWU?wÛ7Sl† 2؆YÓ˜#nÒjŽ#‘–É¢¦¬_”‘3gJ²ˆ‰ü#ÿQÐ?3År5£6BÌ¢¿ÌÀ2(ÿÈ`³{Ž÷|ßûþx½ç÷ïÂáÜ{νïžw?÷¼sß½ïû5Ð.€ãÊw.¸q/@ýš'º w UÔ@~Ç6Hoa~}@7‡®£Ê³¹,mîÂü\¤;æsžLh@ºòõ÷#-d=¥?þþwšß§Ú-AZ„„fBNõ;55u³骑:‘&¹¼×ÛFdÄI&:âUJ/×›ðÎêÚÚ†`Ò6Ô”±¡TߢW÷~Óq¬¢Øe ¥Í~¦œ’U)¹Ð¥Oj ‹ÙPªoÑoDZoìýLàMê{þÈùCcôÃ+°^+`S–lZ›…LsY.˜Ñ?…4ŒôÒsH/"½ +n®‚ÒÑóƒž)…æA/R7ì€Ó˜ÔC¬Ezrú¹AÞÆ$su–â9ðÇw΀‡âû"«bÙ~ÅÏ(}’¾SȆR}‹^®7GÙ@÷–ùTr)ªO½Ô‚ôÒ¤ïS¢#ÿ(æSÏ"uÀë°[ùù ùQJûQÔyصë›Ð<\Štilld]PÕg©€ä}¶ +¬/ìA:Œ4ÄöK~?Ûy8P'ªÝÔgv“ŸEÚt +é=n#²£,»¦øn¥Ïü<ýÕÏ{Áâò.Òi¤!ßÏEGõ‹ù9]g"»ì<ÊpN?EÅ™ˆð%,G Œ³èHV ç +HÏ®Ÿa›^ŠãÃgÁâ÷„±]9Þ‰ü¸øœùð­Iq|˜ð%,/BgÑe>ìOŠŠ-á`ñûÂØŠŽ°(†í3H» yszÍNksyo­†d××´6m»–n·ÿ¡e>¬S#5#]AZÍmDvœeWoVúÌ?ÒOqbÜ'H«¾DzòýCtÙ:ÕÏ'ƾ„å(„q]ãüIQ±}‰vR¿ß Œ­è(^E‹qÛB1NÖ®Iƹ°1­\œÓ2âÜ  ýk€ËH[¹ÈN°ì²âÝJŸùHú)NœûìyÅ×>Ë]çüLqâáKX~aœE—Å9Rœw9”ðûÂ؊Ηw9:ÏÆÁ•h™/g%ß‚=9î¬ä<ëƹ¬ëø›O"Cº„tÛˆì$Ë.)~Né3¿N?ʼn͟ÝgEúòýZtYlö3ʼnͣ`±ƒ0΢Ëb³?)Nlþ,~¿@[Ñ•‹Íý*6SÒ±¹’Í“Šª +È|‰ÍôeÅ]c\l6ü½Ï$—ubó1¤ ¤«$çï•DvŒeWŸPú̯ÓOqb3áB3å Ò™|¿]›ýLqbóç`±ü +Â8‹.‹Íþ¤8>L˜~ƒƒØŠ®œ ô[„¸g}†sú)îw „%}ÇÄYt™û“⬯ SÂïwc+:_Ö׳Ý7ª3nï+(óa}MëgÚךcÜÞ—äeŽÊºNcDßy?lì9×^j–+Ù^ï,,ͱjâqX©ÆJòMlïÊ@¤æÓÇ<#Æe>ŒýlòƒÆÆÝ•ßÇv ÔñÁî³lÓ˜²[Ëz¸Ü«ä>¼g1|æjÜù¬ÈŽ°ì„âÝJŸÅ·ôSÔøF±é¨±ç7„SðlGt„}©µKl¿Ó’zößÒww#Æ}“”ùâÃ+Àúk8Y+—u]|ø±ßž2î[B‘bÙ)Å›•>óáôSœ÷ÌÃÆ~ktÚ„¿C]¹÷LòámàÖ¦D +`Ïj£Î×4~ºŠm¸ìïãûا¨Í./G>`è÷yóXF~ö2ë¶1ïWuW0o-ÃÛ¹]_§ƒ¯ÛÁý´+›ÚÙÖ6æ«™7òýà½MéßíÇ}Vê±ý¿ŒÉ#?§fºžßlìýSÿ4ÎÕ™Öù/h|ȯ¶óx×p¾Aa¡ë4$4VKvG« +È’êK¾›ß¤ú +Ê|Àãižï}*~kY+—uÝJ>Åî +Æ®½¶"‰íÞÀy’õ¨:"Ÿéó¦æö]Ìßåú˜WÉ;_R}þöz©>å{٠·9ý¨±ïŠ4ö½|ZÖÃå^%OÒïéwÞµÆýV=(K²/"ÚÛÒÿÿ¢e•öUZkwâÅjÁÆ¥&n#²N–mV¼Vé“ðÙR6”ê[ô•Ã6¶¥ùZä‹å¾8¿–ã»ÔyRÏ»™ô]Éy×bhï`ò¸ÈZX¶Nñ~¥OjÞ²Aò-ŠK]·ÒcHد1ö*Ȧa¾/É“î}.ë:IÍ»™ô]ÉyGÏ^ú]>íOÿÄmDVDz&ÅG”>©yWÈÉ×).utÝJ!a¿Ø¸=þ‹|_’'Ý.ë:IÍ»™ô]éywm¢s£œ’Õ±¬IñëJŸä¼ Ú ù:Å¥Ž®[é1ì +OÎ8ì)OºjÖé:Iλ¸}7€{T²Î•}* ¯çgô<–Ñÿ ÍgÝÝÌ©º{˜–áCÜn˜¯3Ì×æ~†”M•Þ£òylÒØ£¢÷”ùú-ƽe>¼7ʸ.3îÿ»$/cº,PGÏ•(ùbó¬–ëQZÀùÿPKü]œˆUPK×.f8 layout-cache5È1 +‚`Æá÷35jt ç …ÀKÍ^ »ˆÐœmëx6ø +ÿßöð89MI}*…'póxæRÒx\ØÑfðU`(CÃüÀêØЂ àÞ`8 +8ƒ”à +îàá±PKƒ<¥ŒgPK×.f8 content.xmlí½ÛŽãÈ’ øÞ_AD£U˜ …HQ·œÌœKæ©@çm3³NNc±HPb'EjH*"£Ô,³À¾6°À=X`¾àô{vnó‹¬_¨/Y3w’¢®t'é”SâAwU…x37·»™›=ûßfŽroùí¹ÏÏÔVûL±\ÓÛîÝó³Ÿ?½:œý‹õWϼÉÄ6­§cÏ\Ì,7<7=7„+ð¸<¥WŸŸ-|÷©gvðÔ5fVð44ŸzsËŸzš¾û)ùý%æÇÉÍé§Cë[Èú0Þ»ò¬1bÿ2¹9ýôØ7XÆ{«éÇ'ëÃßç|âÖgs#´× øæØî×çgÓ0œ?½¸xxxh=tZžw¡‡Ã r5ØLî›/|‡Ü56/,ÇÂjK½ˆïY¡Á +Þ›É]ÌF–ÏŒ#46v5¸¿c¦ˆû»¨1§†ÏLäæÕííŒÙ··3N?;3ÂéŽ=\¼‹äo^/iÁŸ±~ ï]A•éÛsæeÒ»ÓÏ{ž—€ŠP%àjí¶~AÿNÝý°÷öß-?u»¹÷vÓpÌãÞlÒà>õî8·î‘LÂGD;Ð.èåäæ`¼óÕÿòÍëæԚ˛íì›Ïm7 +1‰´Aú⯔XlR”©Ÿ& @Ï'†i-Ó àŠòŒò@rE¡ã^>?û ²¥2¬È=¾if;«×–¯˜Û¡ $xoø6Ê­•kHê$óíO·ñy$÷yzG•JéÉìóôdöyz2û<=™}žžÌ>OOfŸ§'³[Ñ“Ù­èÉèVô·Br·¢×¸9 û­X‰ÝŠ^S¡%¹[Ñ?*·¢/³[Ñ—Ù­èËìVôev+ú2»}™ÝŠ¾ÌnE_f·¢/£[ÑoÜ +ÉÝŠ~ãVä$ì´b%v+úM¶Br·bpTZ™ÝŠÌnÅ@f·b ³[1Ù­ÈìV d®ÐÈìó döy2ú<ƒÆç‘Üç4>O>´í°°‹õ0í ÈŒ'èHì§ +?Mr?mX‚Ÿ¦¶w¤ºzµnÚP›ÖiéZ¿¨ù2ä¦i-}X¸'ñPPÛ_­5(Þ0y(ȇ´:jaOh(£U:l¬RÉ­R écØ¡êÑÖXxrÙ­›ÜZYx­í6^51œ ¸†*Cs®z—½þnﲘÕvacYo +†=9Œeµ-³µ ÐIl.t¢ìå~ñÉAmAör¯¥©e NBƒ™áì±#¶˜‘¬a‹€·Æf–Ê"CJ>Á©“ѬŸÙi©}}›©§¶ÚaŶž¨!‘Ö°øÌ1UÔ”ÈaK딌ˑŒbf,Bï|å¢gTÕ6Å_¬2ʇŸwÒ÷ë…i +å£áÊÏ®mzck Å +DÛëu~2¦À#Ú> +¡Ujëlœ$mhì&Må˜ÛÐ)WËfm.Õ’Öš.GÜœi8ˆOQè’±P®Ä\~U™â2h’b^y¤%aBSI _í· ²UK1ª|¾È•'Ì +­“êàÁb®ÌÙI`±QÀ&,’+CØØ°‚Y(pVYèãí©°P¶ª–ƒªM\6ÒpHÝ8$Wn´á‚.Ø6©·›ÅMx"3•]þº_¾š_¾ðƒçϧ†JÒT™H3‡ð.Xº§VJ«Õò‚¬ Õ†˜yA¤ÉÂË ÕR{ù6I±äiðCõv}­5Fù<$>}ʬÉdœ’c(›´Ë‘ØÌò亨ÁNºØ±k’j4­ÕÕE1Ó6Na&×MjâÞЊGuÅÆA#aw®¤šÂ¹ÂzÅÝüºÏy‚³+øpP³QÕ(žÁ1NçážD^,ØXZ2»-Mè@g¦[qš¯Q- +›žM%«wéež¯Ñc +ƒ”Å '9­a †Êb ÊΔ6f^SÎÕ0áv&¬<‘Û0a£ Í„õ ‰ˆ?³Ü°©dÑö‚55 «——ï>𤓣ޥbÙÙöy9Ük2«G*ë)B ¼â£” +Ò˜ís㔊bŒVº[Ñ«<ÓzeÜr§lœŠ]ä}”9LÉÎñÔä„YÅ”'ëð¯†òNAî‰Ï¬5Ô'ƒÜ“ŽðÄg“òžLÃíZòˆ<‡6Ü­ÌóçSØ”çgùóÁZHþš>Χ–k (:wŒñüS‚2DÔ¹cÏìP^—"¾•¢èô’|kf€;fNd]›ëž/‚éÚ-ÜRñ¹6‘-|ŠÒK·U&AVã]*ú—µá)ïBúâ³õWõuáîÍÁ>,Y?çRì¹zÇíK1‰`Á!?9)sGŽEÁR¼ÕuPO_p`îðô!,É\3É%8–Ú@´Õƒ¹aZ«iº2¥š¬q•:ÕÕôeû"Übå˜ùsÌÁ©¾¬CÇÎE’¸KeŸ|>“ÔžÿžÐa´ÝÝ&ÿÛ@yÄçÊõß}ÒyNA' ) Ê‹Çʦ.uíô‚OxòJuù’©*¼E†äYöÀ“ÝóLª<94hf&ä¥x©Ê +šS¶‡9àW6…ˆr¹ÇØÉ®|ªmŠå¢ÚÓr˜McÓxÝ[¯™_ Rº”<ÊØ|-¥¤4ÖosÊl…Cšæù˜°]7<¸n¨vŽÔ XBépBiNÅÒ +Õ³‘(’•Ú¨]¯£A3¢öê‚Ųœ\áx¹aØtƒ97ðl’ÈTa_VC ÓRûµóOÌD6³j¯LeÙÕ. 1lÒqrQíéˆãº +_St`zMêˆêb.»X‰S¢kåµ1§€ * +ž6 STÉ š^ã5.EKWÖ4f-™mÔpÕO×ÈzҬᡆ‡äÐB"3§y9ˆë…d W‡¾Ú"šȉ +!çKǨ튓f29{ǒᚠо™£¼ÆM.ê,{g³ì1ÉËj»²D‚¥\‹~yaèÍPjª¶”Q²õI*J4õj£¶Åç¹êE½‘Ž–&Äê⡉B¦Ñ¤vDVR#ú¶‘¹øtÏ–t(?˜å:_¶& j»òÃ+Ç1"©”Ye\u”ݽj9òm‡ˆ8êÓÊj[Öþ^‡§?4ª²ö?<ya:žQŒ¹Ë>£Q1ï«"ëÿ‡²õ餳šà2 A6\ F¡ îßÐÖÒnK§ß“z_* ÄÅ9ʾ®ƒg©¶ÔžD›:¤×!©êQ6™’ÌÝhX¤Ö,R׊q1g–ĶoË(uÈ"Ez}½À™Ë›æF*Ê%k×ÆFU2!Ñô¯¬WþRY ¬ËK¥re´¦@¹Œ=´ +o*&¶Ñ¶àá°G¨÷DQW/7=w÷ZU_YÝÐsc×ñRå‘ö0’Ünkú÷H+BšxJ£ÌÚQ&bj-9Í)ëÀŽýGZà¯éã|j¹’Ö¹cŒÇ ”NçŽ=³Lt†×þ®p¿¤²ÍËçDyâ;Í~W±ßU„•g­ºdIù"}ü«ºú¤ŠK¸û*~*°˜ÀÍb7¹ +¦Ž|+l›VÑqtù¸,W]JQÌ!ò*’«H„Í~¯/RøCUòènä pc/¯Ÿ`aËúü.ñ{˜ÓÂò”õ:rÑ©Âo.tÆ許_…+¢F±M)ÛR®xÓªp,ÙX¦Ù4ÖMÓ«ðI¥Ñ2 ÎJÅè¯Â»”FÍȇþRÎ04µ_ŒØ–'ßÄ¿˜7í0§ŠoÚ‘´cäÞ/~·¼,‘v’ûS¾ã¯Ë“¢/{ë$gùr姧Ÿð“¨`B¥m’+×Å7WØí” »ò$€+p?¤Ë v·;ÛÑo[úEÞº@v®bcQÇv¿fYQÍ60mƒ§[XIR~ã§)椋R¬al_C‰“¤™¬æõ#›ÃLE*L`Ðõ£–ÃœL¨À¶•Èñ.×øC"rT’dsU\ƒ_±Ê‰ì +•Wºùã +e£;^%Àˆ¡˜ýW÷¨¶\}Èzò7ª?brZ‡Œzu­‰¯2P.]Ü¥'ÏX‡½»Ö Ý+ƒE¥ë +yÔ1Í^®£%¢ûÝHîMhJäÞŸ* +ø"u‡;„,m´¿õSE)_·˜f«mµ<ó.)̲_bÂ,ÛŽò•f;kG€>Ì$ÅÒ4}í˱8¡¦Ô¥ëœ~Ê8}Ô?t¤â`½áäSG‡‹b4q\ö]’§¹b#ü¸+Z¸w[žqUnkí·­”š‹†)%Ý]yº,ŠÜÖõ@Vµ‘*îM©¢ÿ[̱ٔd® êhb8]´gHµÞÜ0íðqËc3P*ÏÏ‚Ðpdž?¦T“Ij7Èk.( +]ì""^rÞðS¥!ç™=;ÖvŠ¦ÝCj>MjÆÝêØAD–+ýZÈry“cÝ[NLÁ‹ÙÈòz‡ÄÛ×ÀØôg`òì‚ó-Z)oé”ò½”·tKyK¯”·ôKyË ”· Ky‹ÚÞúšnI½'%VÉ[f(U\ÛÈjD ´:ÄMÌTû`¡ŒµÆHðã³ o2±M멱f€È¥—ŸE—FÞø‘<ýo¡ŸŒ~ÀÕ ø÷g©×L\¾Q®QµzŽÌûÙ§Êåؘ‡ö½¥\îWåá‚›}¤€²ƒ›A¿ßÛsbnG(Ÿg÷ö=<ì[Ê +aåXßÊø‚NæÒxï˜n¹Cˆkæg/.áÔóŸô®(§ÖשW#è§¹ß ‚¡ÝþAî¹& 'hyþÝ–wn[M7s½¼wlƒ¼·òÖ}Këo ¸(m7ßõùóàíb¦¥ùžÈe;´fôÇ= öÏ^Ћ¡gžƒuý5¾ÇGkôÞ æžºZäñBß"‡Œ&JÓ‚]Ñ/É:R?î߀Ÿ<ßþØÏppÀkÛµ2·lyÇpCOïÞ zkÛ]ÄzsƒÊÞªåë3^²ë5{esÄÕGR×J,=vïÄŽ½ØÜ‚{ö^ÍVªS+øbîæ +ŸÀ€ÿ)ÖVpÇþ›áe«H N-0>±ï>*feáÚèÉN$ÕÍ¥T@©nÄR}„R=ºJDzrÅŒdû<’í­Ùä´š-†×n©5êúÊ2ÂHòCg¶ÐW{g/>ùÌ ÛU&¸Š7Q–+A]¤¾õTaÝöóžvs*4@bšPO“òÓ„|cóÙdlfÅx…²˜{nll^¼˜ûÖ½í-Å0­ €ÿSBð¼–AÀ~Ï–KXáÍè6âdÀÿ;Ž‡¦®2³fžÿ€#äË› ” 8PƱŒ{°íÓ'ËÜúbN‘¦– ªÎWæ^Ø KZ¢0²4Aõ‚_PaF$À {@7vnøð,&P|kba4 .á1ô³”Ðßð R· +z@ ^ŠYør„g°ÈÎŒ½°× !凫O—?Šål“%Ò0l¼øÿc#4`¿=Ü`¸, +‚?¾MFƒèa@üîXîÐÜÄ÷fŠŠ{©öDAñjá8K0~°ÇðáEŽ +Ùd*ÃAˆ­¬#ÂG¦ónmÏžP¾ƒ}ï™Â½³DANf>MPꬪï{Û¨€”?Xwp?ðÓhx¾ . ÿ3;èN XßLk&4:$h`)^Ÿø=¯Á$tSà„»}BBÓ9ÙËžÆl%êóŸ¼UbXù8­¿vǻɊkO³6‰è£¸¹½QBãN¯ëê`?Ï*é`Œ­so2 ”‘>X–»dö À +Ñò€$oá›ëWQ;êx¼(mÓ‹šØ€é©mù†oNW¼Ûz[U[úZÈOCª{ÈÓ[¾ÿÇïúþOßÿó÷¿üöï¿ÿ }xr1ý–õ[âýX¾ój‹™›ýlër·ÌóøU±Ç¯·>ŽZ+ûÙxÝkŸ¶@“2,;A,¥Ëäà}CqÀQdœ„SÎÃÇ9É! ¯ïÖ'×vMg1¶.ÖÈþ\xu!¦wã|yý¢àJ -$önw¾ú;ìÞáö´ÐJõÌ•.ð0§A0öÍ/¨ÏÓ—æ~º.åä‚|òs0sf ‡¤l"LØ0$ž#ð +iUEZck‚!²û©ÔdÕψCvì’°b웤ýoQyt逧>3Lß‹-­ìÈ¥~öBY¹ù´¨x =S1#½t¦É)’úþkB²¡.)6+E]£/ÁcðÅžHO`DýÂÏÔ^“†èƒ‰iÃû©rnMŠMB +‹q ;‰e©â.’ f]!É5XSm+ÖÅœ½ÀÄV½ýËN»ñ//wf¡>pLmÖÑFZë^jÁÓQQ°Pƒ)Jb¢£,k¼¡Û™±!3üÐiDF#2ʲ‰½yë^~yAL`€•VÁÕO*#u´„ŠŒñØÿ27Âé-í{¾³ùü—¹*99êv3qÝp=˜àÇ%1ÛЀT… ÇbhõN;¢%?g`Ý@ÎHž'œ!·eÇĤ‚‡'pñ +__¤ìŽÙâÛ1ú¤‚“”«eǵL³…ÚxB>"s>*!8ar—8"‘;VO}!ý,ÿè>®ã!wZ9¦ÜY®å!8ú[¨ý´èV~1m»vø«œ­c Zj¥*\¿m8ö/4¬ýê㛆jå§ZZ^ýeFΊ…¼å§ÜSQÍy„”†Œå7 dƒ½BøH˜Vøór´þ†Tk q#Rõá1Ðjt¥!Ö£$Ö±…-%OÜ.HŽ¥FØÊ•ß"ˆöê”=²]ôÛøfõ á‘~ÙSkË“¢â¨ò…ô]ä½1Ïþ­5­Ó»Ët° Ó +ˆ‰iÍKfÔ¦dF 6ö±µÍÓ1‚ Hž“%Õ3‘´Iõà¡kPÈbIøE¾cÊ +ÕUAuþxIu£ ¡<ù ÏaÓG3TLÃqαí*É]¼À‚ψOŒää6Õä’ö_fžk‡^­dÞ²ËÌ2‚…O{FFÔ×Pšû”¢´BŒ<Ã׉Ä,l%þgh™xØå4‰KbÍ9³ìÁT'’¢ Ÿ,1I,©Àô7f_R½ˆêa†‘øDºƒRCWòìÎ’®@L¹aý(ŠVÅÌR=¹ïÖ{h?qI¬c¡eãW\›–[Øb—‘ +b4d&Ö-ÉŒt(˜ûVˆÅµ ´ÕŒÒ +üä$j:`fwÜ9‹#¡½N_^Ú G_æ¾wW zKÑS’˜ÀnžwÀ>§EQ2[d@Qx*Vv‘Úa Õøp,½KTpúÉžÕ<ÿ׫0ÿ×é6’a{|™ÚŽÕ{òK†7ØTã£=S(ÐQ[Ó·ç&Ç6©D0Õ‹˜R-AK ¥•_é/;Q³§‰u*m’½ +}£·õ*~žêPc<“ž=HתĚðM8“âÞ¶Ös;ê7‘_p‹ÞëÙ‡ôÍ)=€‹ÞMÆÞ¤F«ÐCïà{"¯p䈗˜§àèz&,™“¡pPLâØ +ÏM>œ]š6X™®bÊdá8+cž°¿ +€¸úùÏǤcºm, ™çst° ÏŸÐáU¾E‚þ ¸s¬ŒdXAÒ°¶¥¼õ”ñ#ÑÌÃÛy„s·ìçŶg#JDIJÙö§µ‰(ùkÁçÝlG&“ÏqÐcŠÑMÇ3¿*É ¢–Ì©=û’¯™C¹X{K«vö‡Á•l±ß +ZC¹u#˘Öî­®2ÚzW «¦±ƒÝd{ÔY¥Czhši –ÞÈvlóž‹…ë9=T<Çê8>-=2lWãɹ5{(T6·öq©Ÿ°DwˆXöÑà«<Ü·ÚOˆãý”Æ!371ž`»ñ_òBTnqƒŸd¶äSÛœ¢Ô0NH”rqþ©LÀáϵÛêi]ö§Àûÿþ ×G‚•¤„dÞ &k@ +ÔQÒ€ó}N$ÉÔ¾›žÏ}Ûóíð1>^£Œ(tæ +ìœöê<æ-õ ÌT"Zné¸ÈmgîO@ž Ë‘'8‰ow«Öb %-DÈüÒsß<ñæŽSßÂtþ1*óÕÒ‹ø z.6iÜî63óaSÉ™¦ “¹|¦‰2`˜hkGP5818ò,ÁÕté–‘q·`?!û|+U¡Ë O’N¸ê+“©Ô%òV?ñÝÁÒªo|×ꊫõ†ô¼¸7fQ +s¦ó!hŒ‘°n.]ïõÂÁ¤>7èà0‘á«köø~•¹AD(,¬&›ƒÒÝq/‘^’…¾uÁbî¹ðA3Ú"ÓWuÊ%uz.O,dÆrA¿#}¨Ø Q[|g} 2Ò~!³%‹¤bNn;=ÝgM¸´°ˆ#’­»u’ÃóоO:F&aµ–’¤é5&> +çñ”%Tã;ƒT$%I™+¡ñÕŠäÌjWÊFÀˆ°ÿ¹ZJΖrzë +g9^Ò¡zŸ‹—~õñM@œË0§ipûKÐÂX÷ÔÙ4.ñõ°¹›bІÿ*VðõµïjÿêjÕüÞG2F1Ë)}zm)¥OºI{#ŠþŸ œÄ‡íôLß2HŠÍµPb¤‡Õ%æž!¢g[£ôFŽ”«Ç_GÓEvM Y?©Ò°ûQ4ø& %{›{žgö7d!ÚR˜D4¢îÂi›{mÎ]\k·„,²ÃzJË4E‹è’tøÈ¢…A€öT½¸¸ +!‘ã…E‹c¢r¢àÑ5§¾çz p-¬À +ñݘnO¢\´@’,:x²Äù q1 +B;\`áãƒN•x¤Î»Ûâ‹MÆŒ/yc„Æyj–V=DF—¡œ:ÓÎê–\ìíîÆðx—;¼¸åƒì¯™«\˳š´KBÄÞÒÉÀcû>ì>-9\ÆfFð•æÕÓóØ =µaøܾÇ%RÉåœs9|”*ÜçÔÑçˆ,/½²9øUp‚euRlV›{oùQÑ‘CËàåzà3(à «‹ŒÚz”²½ý†áÜa%Ôt,§¸SÌQ-°ÎhUùÙÁÂÞrÒاŠ~N^iSvDªNñ––ò£lQ~žÆ³mŒ¬Ý®ý ,ÛÀ˜úCéCrŒïañ¹çV3¶W¹- +èý=¨!»˜Ûs–ÕëOÈ +"¼‚YK+ŸÖÄŵQ>‘œM\-v®ë'5(Xï[w°kùÂü½l9Ø롘ÃL¥5×Ͼõ4zChŒ˜Ø=öØÄ çÑÑ^Ö)™0ßõåGåµbùóׯ乿ÿú"ž°iUèØrŒG<7U`›&¨‹'@4áƒeQŠøðòò&ñ€I %ühܶC««c¶™Ø>ÒyÑÒF»p7Q–ƒ¢»ßnøá9a…çg©3í…¶ôjym¹w¶R²ŸÑÍ€{g‹Yd_Ï0G„0µºI)OõÓˆîlñÕc+™¦R6QXÒé\Á=pÁøÇ´§ÁEÚ$À`pœ|ÀÓú—ןnÿø’ë;1O†[èÄS¸Ôòáû/¯ºüðvŒ«iŒ“ÿ_¢èU ::Á£>ÒŸKìæ²(×´Qn^:NdƬapdMˆY·=¬ 2ãÒv¤•jѱ* *\GVXK¹\‡#Ø-XÔOFß»ÈÁö°„ËŸ?½÷êÃË?åZE.s§„=FàQ1 ôÌðŸ?Ü~Ê·½ô Z¼¹É.]õC¬¾~TFDEA¹!.’øñ6),ñ#ádDâþ3ƒ­c×"š17âÆk„@xÖ›[có‚EýÇ%ûÑÞ¢…$ù—Èá´ÙQ÷pQ +Ñ<žÏ÷>¢YQniš¡;½ªç)ÚÄ‹ XQÚ9”ÞÂ…¼Ac +Ü1ÔŸÉùª 1§QºáAlk•K{f‡<¤Š$DäÝÊ™H1 ÿœ†?ÎHàµ~ÂÞŠÖÒ”ó%²“žíõcjq¹ û³ZìŒÆçC'\T«Ÿ½HŸ²?…rµÓyóÓ/|&”¨UL‚«¸gL±\ö]ŠÛï‘[VÛGig™¦´ÄaJ÷}¢Œ—ùlë2nÍ•ïñ«b_{ü¦Øã/·>ÎÒPM+ÒPMßr±àÑãùk¿g6]Ô +·>ëgÅØ°7Zø„«û< |¹ìdòldV‹+Øòðâ“é|]Ï+— +æËÀüd~eñYI +‹òkQvùÉ7Ç"7檑q®ÐÚu$žʘ‰4)”ü‹‚¶:B­¥ eÎh sŠ¬i¬'ÈäbM5È3·Ç6‘Ñ“øPìíT¦ñJ`(]“Ân«';˳xL,ÿÀ:¼äh8þ3ÉDù1ñ•>0’ó‘*=§«òs:+…Ó3Ùh€ÚÎÎGÃ|ßå"Ø+›Cˆèj*™´<Òhù¶W+›¡q7!Ÿ›à×ǃ'¹˜K´ïÓ?\­ÙøÒr@£ímŸG'¾)5“vøò©òˆêã^[v… …9À휾òkV³„ª˜ôD ®ò§ì¶*eyI]®Z|>õΘô?YÊÔ‚ÿ&½à¢òo8ìégZvB‹¢¿‘QRuŠù«eÍ—uä v4…=&²Àº@®"™TT“±&(©Òn)¯xòòú²$€ÙðL\?@&lÐZŒ@QµöÿsÐRÖç³.îÇÌsíT“`yY +^Ãv>A+¶uãD; Ý`mŸNGÆôx6vá„X +èx9 °¿úy7dõeª¼Æã@ãÝ]ð +VlcAVÖåå.šâ;µP`±Œ§è¢êè@ç½õÜó¤ïQê@4òEt Kƒ¨^2i¹’ª¨n­¡Ô +ñ¨ýOZ¬¡ˆÜH*k—¥Lø?„rÏûª8öW‹yPjõK»§à£“]ðÑ)PðÑ)VðÑi]í¨\ð­¹……·XºPè…j::;j:˜Uìñ?ôë·ýúß殦éñ:¥TN¨â,¼rè— k@è` + ©•`Wv<Ê°/;€ÉrÊ *0X:¬ YuIYa·¢êSË*F¤Ä&³õ8nàÚ«Û̽êÞ+ÖQÍù—^Â/ŽÌKPÀ­RöV\…CóÙp•¬)ª)›€|Œáyö*ª +ò%¬vx$0 _„b͹2 kÎÉ/DQZJR¸jÔ<´-UFJA`À¬ ÅFOÆ謈ì`Ö•Bc¸'…FÙal”çIv-ïÔ„Ðæ¡zvKÄg’z îzg&‡ò|O«#|û¨6‚@x&¥…Ÿi*7FÒ#³.4KZ&M +̉Ÿ &ƒØt#eÌcŠmGÊÓT1î Û=dÃÆ=}—W3®cOq½P™÷IPìÌ·,ÿcìÚ3LÁ†–#-“ôÅ ±{jà؃=@x\Ë/± Û5Å´¾³¹5Ç\Kœ2£øEòbÖg˜ûÀ.{¿"®'@ ˜‚šYöeO÷9›SIf$Ùe¸ðùÉ"•^Á¥Ø.èšÉ†=~ú +É®Ç/:15K”Ñ.j¹ëƒ¸rƒ}/†Øã|ÝòÙ4·ì¦¡)(ú‘e¹Êغ·oÔD þøÁ'D•˜?ýñæ5k1â@φ­»ì 3@8A;-øÐr)P‹À¸#ÅïFo™áù;߆;ä÷¾wç³uˆà5èÑÅÆ·Ž}°:\ü•±7SŒùÜ÷ sª<ÈKX¨êCüà £[ÉV0®^ïì7hë.\W¶-ŒkƒÉÚA¯–š‹ãE»_µ/Ý,©««Ë~rQ™ì‚|j™]êñ[À½hæ~TÌõ9¾O…Çýðvt¥hà€ý1}¨5òßÉ[X :fég æ~ä9'œ­Ì-œçYmÉ·2Š¤ƒäõ-c¼ +ŠF&,û緔˙·pI('}çŠëÅx> ZJ}kíÞÔü›™QAæ3¤~%›ÄæH•9ãÎ#¸¶}çZã$L‘©ÇÙRÙëõF¶Ô^¶D[yÙ‚'Xž¡(øÙ¨<=2×É#ä Î^¼¡!~ÜÓ°j°ð‰Ù¾žU‘”U†™¬2lgÅVx)BæK +”¸"Ë„'Hmr káÒ¤ áwâXÄ­‹¦D:ƨˆû°Ë{K]4üÖ¥ôhþ†&“'Pÿ†®H³ŒÐΑd»–Ÿ}¦[‡y;y‰Lž(¬™(D&g:uݸŽ'd˜S{Îü~‰¯Xd3¥§ÝÞ«ívvR'ûž¤'Ø2k{½¥¶ÔæÕÞ7ô¹SÂÝ—3ÜÔ0e `>óÔ¨m5AÞ²¶iÏqöaöqöaãìÃbÇÙ‡­«b_{|ûYw–ªða‘#ÓÃÂ'ñ:zV±ÃÙ‹·ð_섺?šò¬¼âÀâ‹WÛÚÙ‹­I´h¤õ3Ú‹"¡¼)Ê·^h±âòYIg+ŠrQÁ*S²nÓù*”‚ +ÂÈÂé¶;_„r²ºèÕÃbTŽò£³#[NLݦåìc­ÇĶ¾X¡Ì¤K Ls¦”PŠg°†gdà5˜{u|´HÊ ++ÖŒ9Òóg/¾ðP Èh8·\(;g/æ¯Wv¸^ã×°ÙIøè‹é9O1Ÿ_.å§qÀg\>þúã¶,µI¤È”±5±]k¬Œ—Eçñ™ccŽQÃå@IÎ1ÈΧ&úišô´S +×ë@á/è–;–{N—A<®ÓÃ?«º?à°5Ìâ†Ý“«–Ë^>=d˵^8X0™—û +W…ßp½ë +l¨¾LÉ¡ÜÂ&H}îÖzËí|s`·I"‰ÁU•eˆƒ +Ü<}´†àõÙ»†ÔjMj{¹”›wº´¶rÑh«tpeIfŸçZçS¬5öÆÖ8i›âãvàØÜTò»?Þ"ö”Îml)•Ä’YX²F0÷Ü@x…رñ”9µÇ_léiµ!OžÞŽå'Ç%Vg,Ï“ãÊí +@rwÊ<áÉMmuÑ3µâŠ£YlÁºcã‹L1ÉMnõQ7€Kù™âôÒë„ÈgrÓO½¨|&?™kq/n’DŸÁú‰ã“!¿2ž*j¹Ál„¼¼T¾¬šX3u ô:Ä’”¿ÿúq•zì“nÿû¯ÿAÁ¦=†s¢ÒÿÞ7àDùÂGm„| ÛYÙã%73†6s6ûÀéf^RÓ§ä5Ž³ëCîÃñø­¤amƒjmPôè{ïè»ÚÎ>û÷l‘@Œµ*j»Øéwx¾Ðñwx¾Ðùwx>ÿxx¸€FÔîøV_Ùø²`|i¹®§à‹³R:mü¯ÄQŒ˜Rà¬ÆE‚¯‘#+ Tž‘³U%<À¬|á…3Mb.ñʺa´<ǯ¤¦àºpU'—€ÎFHGå"ϳhŽ¸E•Ja›êÎåÉÁ6æWë‹+5EÖ…sª™6$ž‡Äƒ†Â +?f +÷†Ä?j7oHü¸Iü¡±Ä +g¢p¾¢„ì ™³{í³—8ÝœOÙÝ•Œ“ÃAûCø1×SLÇ3¿®V4±ÍwÆÂ(Zï:$UÛ‡.dÁÒâXo'ïXÁM‡ +l_™OqáÀ2§†Ì ö=¸Á!Zdm\ -¡$àºèÀ¡=²;|$C³¦¡7?wp3Žñ^8Vü’¹ïáÄã<¢Õö€abEÖÔ$f؃].Y¸â¡T•Tž¹æÔ÷\oAGCÁŽó}vD»·kLGFG³)¸  ÌÒR.ArÅ{MfÄ$/Ÿ{ŽáÃ^n_p(9Âz]îOTÖHÆZ+tž:@©ñ•T虞³†Hñƒïˆ»Ñ6‚ÀòC2 'lFå’1Fع^M5Œ¹ˆOo_ÄÍžpÔmÁ¢?D`øÖÌ°Ý '`8uáD¨ãCÁkelìГç<Â+b؈eËËi\ U?ÛÁt„¨Æ¸|su©\þË[lâgâ¨l°œá#l¥&:ÆVè){«eé´¶Ô’êQ|ÔvÇ8£ …¥©#—@8ê–’t³ªœ‡>¢j>¢ž-„‘¥¬öz¸Éïù-媵;HxD£ƒ¬Œ-z§íF3èpب£× ÉìS2¦n1ScH…J¥…‘5ž¡ŒQ/Òô\@…ë@Žw´á(¿X¾Ç<+ 5’ËÓ<+à΃ñ¬@ÕbbmöW.KUÿÏ™© ¢bm,eŒïmD$aJi„}à&×|$|x +ɹ‘ÎTLøÚƒ=¶€î +MMeÚ7 7Þ»[s P¦bDƒsÍ”ubÝÛ¨ª³9˜7©•‚Ù³Ÿ‰dŠQÅŒ2O, Ë cƒŸ #QóÙ|4 G.Fºﱃ`oàç·Ÿ^&*y±ùšþ)ÁuÌÚj'¶ ÛÏ–½ +É®"Q¸Ñáöñ«ûÔ-‡eÅw² +ŽSUÀu'ÂPh›_D®a” Ì|˜¶âÂ?ć±fóðQIu³J§ÜJ}“k„x6ÚïÅZ„{ê)¡¯IŒø¯‚£ðTêÒõmK†½Ú³f²¢ðÁSð0ù½µÁ6c{2ÿÜðMÉ,ѾG±A¬á•ð0UÍjÃ.é-' Ó«æó3ôœwg•·"5õc ¬ú!-ÔªàÔ//oÕ¸7Àx[õë(gFýèˆ×}¼Y\þícÚT•?/whü‡îÊ?S®_ÿÀN^°Û×F ¼¦›ÉjøñÀ2Dé«záŒï7üðœPÖó³TtµØöê°¹ìñá„f¦Ú,NÙ£€™â…X½Ï.Ï^p„»KÀ1`´öy¹qTxÛV <`„Lzs¿·p1C¹«v:o~ú%"€‰OmI—º§Ÿ½ˆh.²ÈÅÁ£ d€,˜¦ïñ¸pÝøØ—›ÿéËûÛ÷/_ß¾}É 3§OGqds-&q¾a~µBÐV6µáw¾1Ÿ*zK# [!h¡Ì(@GH«j/‹¢!ÓìøíóL³Å×¾9xÍp!ô3€¾ ô +ÛÄøÌj.f‡å»!©ŠË3†ü‡:ر™G8¡B ¨€‰³ôaÔ0w"¹Aƒ¸0˼"ëÜþt '°¾[ôÜ6UVÄ©7(&q +ÎùâT@¡x¥‡!ac<&3C@ +úÖ,S&EÑ|ïxk¢ BŽDÏp/¹ö(ÚE÷2¯UűÁ^¾úðå§Û/7·/¯^snòï¿þƒ²²sc;Àô¤2µï¦ÊÜ·=L?ÄQ 8ZÁ41„a¾×­ â_¿ûœóçÛñâ'íUØ“µ }. ìúÝ›«Û·—ŸÞ}ø;öçà[_~þøòËç›ËO—Y+X€ÞyÄðæ¶ÔÜ£¦œ>ák¾c[~Kùh± Ï~›Ç¤ IÏØfäû†Îî¬X£ìöwúer†¦Ö€1Þ¾ûôåãO—^~¹¼þô(ÿÍåÛ›‚äëƒ0·^xûÇËTøyâ{3¸û™_¯^.ÇÆœxÙñ[æöÜrÐj‹¢c\ÀÂ×ùC¡9‰Œ³ÔB*Ò÷öå—›—×ïn^~`ç •K"æ9ŒÄÞº‘8·ü™Ææ¢ç‚lļt`‘äÄ´žE]ÞˆFH‡—.¤¡JD©nÊ=V‡½b*íkkTú6™ö¸—ÆE¥ý +*õ½©s»'qeò+5d¼Œµýd¼ý¡Ìð3Üðq-ÜÕMä¿“½å² ÷)Û'JaiLÔ0n;ñ–Â^†×ÂùJ9‚8Cöp‰ôÁE +x/*iCËþ|n`aáf´¯ê`Ú¥–¸»KÉwo-$oöl1C… +ÌÅŒÔ5É¢Ø4)Itø½å;Æ|Ž´Xö$eBð:LƒÁµ–òêöÕ;%˜z gŒá:RIJv†ekð¾¹÷7Ì^¨£i%”r€¨¸ +1ºî[½åŽ)X¸4®J[äÃW$}ûÙóÇÊ{#àÌ|šúÞâŽÝÍB–eÏ«ð>¿ÿÄóú9WÌ—àY¦Ahh²^ŸD©y‰™b6ÝN,¹ŠÇGDär-*q½ž{éQmà¯PcÂõ[RA$¸'-r’º@JÇ·/‚O]p®oDi"W‰ÛUù“˜)Û‚ý=_Ø +¿•#ì†+‹?SùÒÜ„›ÃÍJ/“ÊU%1ÁÕªwŽVÝíí¥…‰ëD˼‚Œ¢ŠTÍ=åpeÔQ$,¬_Ô…‹©˜#Û5Bp²à/R«Œ’î Èò(Td:Q*YšTK'µ.v@«%÷©ÜGbs¢NÛqcË z7>—q(9ŸfŽ¥ÒOЈZ)Œu8‹¹Wˆ.·–ep<¹|wÌõ=…›ú9¡›/sщ}Θž"UB*ãìxžbC'¤œ[T +PölìO'>ü¤ÿLß2ñÕ3ú+ýûû?üöë÷?ýöï¾ÿå·ÿíûŸû·ßÿÓ÷¿|ÿ•ïÿíû?ýö¿ÿó÷ÿôÛÿªF¾'ðÌÔó£3£FpnN +ÿL îïž>`wÖçgªÖj÷ÌýmjÙwÓðùY¿Õ ñGòÑ_Îm ßoÏÏÚ1œö ÃßÛýútê[X…Mè=¸ÐÚø¿Kÿ©½RUü·zóêJ½lëZ÷ò²õ0›œEF'Y‰•ÿNÖÃó3 |Üqü“¯6B¸Ós_{Æ8é_|±ÄY‰›šÉõÔYºCîÖ[–J2ìÉ +4†·Ë +¢¶Fü\ºŒ@9 '“³\KÕ3™ä3nεhÃðš&‚ÕTvV{¹Îj7ºÖÖ_ÞÜ–ÕÔN»T^ã¢?dL0&—%V—ÎÀ«öÛªÆ;c¯€4™3ª¼G€x舳x¸R7ÄÃKµÕo¿<¬x臕£• b¥nNéÀÑ訇as]›wØÙüjÍ/_]u¯z½Á‰[úùüÈmy7—)ßaÐÃöƒ~Ò'Y3[÷±7Àx ¼°ïËFyÖHG ïOR$Õµ»ê¢º†f¬ø÷ ½õÈƃçûð<®¤#å…j|’C§ñƒØ²D™ØßÒ‡<˜q$°Ñ³#gä[ÆWøqaâ¹ÝÀñð‘§h;i1Õ÷&Bú*¾± +á~‡ädÆÄfAL²SˆNì-À€fOâáŠSi¤å™g.ãÈ_¡øû„]b`©ÓGÂÌ<Í×àty +ׇSµ8Ë“ziÆ ûVw†›q§?v º4‘zg…I©Ôà J:ÙÆ~ bÐÛw®m´+ãø`9í'šâÝ<¿ÉY•D[ðÍ¥ƒÙ7'cÆ›ÃîQ ò!R_†S–=;÷MÊT&eª‰ñœîÊ8iR-8)SÝ1)“©Ó®Z¨Ó®ZÎüú[³‚Ÿ•Ø#0UÁ`MºoÌ„¼1Z3ãõ§ÄõþAŸ‡qƒŒÛ]ö‹|ÉçgZwoÿ D𬬆Ӆ٠ŒQVªXÒ/£‹³ë-;æžäi’ïQ‡ 2þçöÿ¢5;´;LÏu`ôp%!ŠÆßLÃÅe†£-È°Y²6WØ'8%ÑWr„Œ (l¾,?>s6ó\;ôhÿMl.ŒÕÄIÕ´¨0ó1eá˜ú¨½_†¾Ø6Ü}Îf–,|r, »ï/œ0ØñQªË—éÙ‰YÌ +¼IX!ìÔ] ‚éåm%¦wV1HÚ*ã…oС1Z»½Xš\1ìÍJw,+¾³=]ëJK%Òr ^1ìa÷oèü zi¬â‘‘ j·ÕÓºÿýÏ2z61€ÆÔM­ñNÁìˆ.|×ðQ +GôaôlÙ-8ô +7ÀÖ¯Þf®M%î01G´`/ +ç'i’dÆQ´»G´ÖëeËíµ¶°d{iÃØcYo7K5ço«ŒØêìV®qVÆ<<œ÷f‹E`ð»¡íë[`ð +:6´‰Ïï,Òú9ÎóEê$I÷åJ—ë%Ô(à®ÇY»nKEœŽ"§ilÏÑô;Áj@š'¥’|­P’º:ö†÷#Oá U%xä<}01m”D*[OcÈàiE2xZÁ ž¶#ƒÇþüuþ  V(Ô¢Ïêý”o¹…baÊ€>5k³‚•>À®È·†ëÖPÙh×ÂäV4j¦Ï^´ÅÒTa¦boäé:ýï{°ÛÞÝ+ðI‘÷¼-þ¢}+ñE ûpqˆÛ^¬­:ü.“ŠL‡—bWÍ0܆l´ÏTô±/î%Ótµõ&¬ü¸ÈWd¥@Å䛿ÓaÝI÷$)·sl”›«YæI“.G†#,é8“GVÂx.N`Žƒ†Ø$‰L)}’þ…4²Â€Æú]t–i2™N¢ ÌM&™ÂS]šl\ ÃöJÄMõ&I¨5äð`Dt#\iµem§¥µ¶wÅÏ ƒtË™qºÑB·¥x¸Bj†k8è÷bm3F—yVª.SŽí~Õþ]±s•1X •Å±ÛÝàeæ7zÐîˆÚ®]H^Qò´Ëp¡ÛË¡âuÂL$ýh‘ûäütDª\tŸ®z„‰ ë¾1Ýc¦ku°.¦oÔîÕðzxè&a½ìö LtÐÓ +wä‘éžR:ç9n¨‘~„ƒÐÍŽ¦[ž†Wµ”+"ðã½h¦¦'‰žÄÒÀ'3¡áÞžáûvŒ¡ÁŽp°PWï3²PŸ™…º}ÂBúË«„….µá«¡Þ=´jèó·Iâ×:;ÝÕÒYi¸•È¼ø‹ ¸ÞÅHîÀ=U³ C›l2Â&f6éiëlz}óêêÀýæø)¾[[Šg¢tÛ5)Œð'k½˜N¦^oì[–Ðäã¤z–¡‹ªôxƒ*$¬ˆ1•rFWt†˜ Yª¶…˜íÃÚGW„šíO(F´äÍŠ®p9ù\V„ÍÞž'΢27ˆ×:ƒõ@‹Úîô®ÛÝ# ´h<ÒµLt EÉLHø0dËÞjG«ÌÍÖ·ÄQ^vÚW½WjûÐ9;ÿP@ sÄQ†núÍA±/44"^®³œÀÂDì +ÉyxÕ'ÿæJ+O%mÕI ›³cmn/ªSN…‘=¡¦H2š+qÐØ×ÊTž:$vÆa®CÒUmq.{/{ÃÞðÀY4á±OxL,cð…é^‘ù¸9ê˜ò3CSo(€1¸ +™˜ƒ¹IW/×c¨¶¾Þ«Azy»Zh‚k{×Ë3ªf®ã©{bç8æº']®sœÚ{¥]]^ºt°ŠhÎkâuMA@árÿá¢þ’ƺMq×Ëö½n/¦û º.Mãe%DѦ +ÚCB[‰HN’ëg”U‘¹ùŽúñvŽUI{s³¹ÏÔhç*4¶OÕÙˆr+}†hN±Ä¨ÛZóHÚ 1´g¤!"B93€Ž{f‡É™Ï%ÌD­À¥:‘ãÕ¸j¿)ß“LBÛ!] +²ý˜e#-NEZd¢–|©8^HÚìÅàò1i£ÊxVb ÔBå£DGjÓï%ÂÒ 0Ãclû™Ì'"vËÔ´F2ÖE2&Â0õ*LªÆ ºä +Y¦ˆ @FÞão3lç€-1&&»¢Œ*f(j[úYîqs>Î0v01l£ +_º‘iMXÛ…ßÿÝÿ¡þ€ÿèàJ­osj±É¸í#xYø¨¤F^Î +ü¯èu|"Aþ@GGzC™ÛsËÁ© q „V²ò„.¯?Ýþ‘kÈog9ä7WÜ°ß8¿ +pü£à2H€ö"È?5f ÍØ(iW¤ND¾sí‰m.Ž5ö­ñ¤½®7ÄRžëp5 Ï7û¼4 ûS,õÖlêÝ"Ô®iM¿âT6›:&QðKe“üi#vRˆê xuœ½Õ­aWÑ è`h_uµƒ6x€OÓ\;À6jd@; xCÿ Ú¶ÍÎ XD™š¢*giÒ{eëp¦8‘¢Ú¾¾üÈßÙ¿C[û—Î +dœR>1ÐÏÞÕ[2ª"=M<¢Û¸+ò²Óv2Yî ½ûí_vÈU,|xôÊØsÿõÿ •¯.¦|ÜGÔ’wŠ1ò!§ääbrÑ0CÐâAh›¦xç’y_ì8é‘ Å¿Ø¹Cå×ФE;ZÍrç«÷¸Ä’·ðMlˆÉ]/"<U¡›¹hM!ááy l¸'£—H3?üþë?¦jhQ0~º/"•Òé‰73DA8…×ë¿ÿúžlXß ÌEÿ˜“›³Ëœ² m8Xä<8$%Æí̘ωBt#u„Š'*õÞ˜QR˜k3”)±æ\ÝšpŒ|XÎlt~+© „br~93„#/zæ†oƒÖ bÀ,kgr¡cY¿Å6ì£Ã0ì£SdØG§à°ÎŽaLý;…úwŠ»À©h¹¬“ÀdáÒ [?dp'P“‰F ±-6æ‘>+±«. ºŒÕ^„e,gÝClÑ6ÕŽnÅýTž+ÿÿ{dÀáa¸€66oÚég<=ØÑPÂgÑñø!ù{ä_üUòçØ3¨ÖÎѺƒ¿øÿPKÂß–XkûPK×.f8 +styles.xmlí]ݎ㸕¾Ÿ§<Ø\­lIv¹ìJWIÏvf€žÞFW5{Ð2m+#K†~Êå¾J‹Å^ì+ìîE^ `0“É3¸Ÿ$¯CR”¨?[’-»ªšÝ@U™<<<{47ØŒéV¡gSª©ÙÃ6&•ù=½«÷8í¨ª|„VÉ —ìUV +PΪþݼ²GÜÍKTc.WÙ7(qÚ¼ýiuóö§bÙ% +%6õ¾…LúãÛW‰/x˪uÚ”ªLÏZUn&£Ë»®‹J +°¥âš6è±Ïõz'ùÚ³ì äæNrÙf¬qwY¤4 Ó{@¡â;â¦%êBRýÖó/ÞKÍ\è¡fÈÄ꛶9Ê3æ`qŽÂ>E]wÞC`’8ƒ/q¢¥eoÒy ‹•˜`ß;äY¤SHå?ò1Øã^õ7ˉkwz{%¸a„ùêã ±0ÉRçØÁžºõÜ%rZ•.Öbˆø3´rýŸ 4,áÌ2ÿø)”¥W°H€¼r«Ä™ÿª°ÖR¶Ê;Ç‚±+ßÞD:Ø_Ï-Z€.ô‚JXN/Üг°§¼ÆëRó4̳„FxNé-èhÔ·‘5s-Hr¹žh‘B¡É•]¥¢Á‹ü“{ByþÚòýª­M„/UvÓFÚÒ)/þãmU í)¥,ó•C½ä0Ѩ£EbU:Bõ;­STPÈ1$zšÖ)7Èñy×V¤&Mñ‰ÄdeQèG]èôtl5mü/¢§†jª&À³^)ãàŒÍa§x†B;šRò +"ÉæZ-,“€»˜>JSWÀI/° § “«+¦îZ…j+¨÷×­Û7Aä‚ÌM&†ó@…‰Vý2Ũ ׳>@MHÑNâ;"†™'ì]•kŽ´€g¤Ú±¶‚…Ê&¾3dû‘õ¹†VÈCTK¢ŽX)£¢0pI=àÖ»ŒÙ«EìT”‰‡L,ý< à9ÝùD¸îØžLR^a9SL&d‘@l”ÊÉ…5˜Ý]ù‘ø½rùÅöÑFäšúôâ33ÔèÚ.ÌA/„hœ¹L<ßúbëÆ* i6ræ!šC’ÒÓ +Àÿxû.Õ,RN…¹rxéHQž÷áþžgE¬xŽã:8Ï’Ì[m|_Â4Î-`çQÆ,ú{U1Òbwöz¨i±Y-°n×Qm4´¨R¹ˆ4`ö¥·¥¢Ã­BÇ BÆp +Ù0 +%€ßì÷HîDêÔ‚ØtH%z׸ГIûì +4›Ž—þ$Ø15ß8ÔÏ3î1ÅÃJ«>I«=«`\8ªÓŠž„y‘u//‘åÐ9 ÷1#G´ +ýE†äàˆ Ë}©h )¢£°Á‰ë‘ ÞÝ5¸‰V>qÝ㈠zîº@ HÍåw¯ÔÀã`AßHÐUA¬:žý:SäM;¥½7¬|…ªÔq°îÀ¶æ cI9£ß†~`Í6*Q´n +:=Âõ ³p &~\[–ñ§ê½QÑèÕNW ·Þèçè Œ§Ðì÷ÿ[pƒßÚo&îtÃ¥†áee£šP(bviˆ@B¼c¢‡WÝ(Z"ÆFˆu'52Î%i7È** FÝ€¬º +·añí€&9$D‚"•ÔîîÀèïn{Ü)R¸ìP¸Œì5ÚøU‚~D?0` 9Õ = ¦©¿Æˆ,Ø›Å>Q(F+±+¸8Ñ€å†Å6¾#C¬QÇYl< rQâYóE>5ò«aÿ¢Ì¯—k:ÑrEõ³bd´VS™I™6}xJ4m™^&®=-wÖQÆYY)žMË6wÅÑnW=0WµëŠ;º8]Š®XÃ¥Ž×÷Åi¤Ìí³z/ÇLåF…kzÎ+˜ó5q‰£‘MX6RÑÞ¼AXÔ£ hˆ‡ö{,=%ÁöðéŽwF4‡ú?ßâ×JVtXj6™KìúV@wnGÝÁx”¸l°Yô&4ÚÝ«ÈCvÇãq– +΃ë<-Þ¾õ¦ê–z麴Ôc°Ô-™<“ÈaÊNÂ{B¦diNgØz ? H" Rwnm¤æÖF§¦{ÕWr›©©©1vÒSãw7¥H;¿+[Š’µú(9ö—ìr— I­ñ¨Ì-k»èQxVpƒ#Zz/˜,À‹Ù±ÕšÊhEzœóÇ­ e±ÛfñC%KQuÀ›Q¼íC@3àÂÕ#¡‚8¿>üïýÝÀ¢üŽ<.7³é^]Ë¥¹ôSlê›p4µvÊMê˜Ú\@§ £QkƒX¥Q©åéë;½û:>Q@´þÊJ–ð3ë'1"*ÌÁÒ>èˆsˆh÷v©]!ÚBMƒ¾@ßdEO‰>Sž+4eßqà•p6t‰&ÞˆR£5šl2•2›(ÔÞ1•©løåH#ÿ[AZ̧‡Yÿ|·0/v½aýdû¿ÛÛ·‚ŸÛþ´ýáò zl°*:Äø@PUÕ=¹ãõ:Û?lÿBíÿñÓ÷Û¶ýô?-ÛÿÆÜ«ä#døYEÈž=ðÏ1DZv€SX³í¹1òyÇHËðbd cäóŽ‘–à)ÄH_ÆÈç#-;ÀSˆ‘ÃuÉyô1Ò²<…ÑeŒ|Þ1Ò²<ÆÎjêäÇkH-ÙsˆÎlêŠHÓÎÁÍ#í-]]¿,8PƒX†¦Pí?¬} ·Ÿ]Ý?ü@îkêt‘™ÙM%¥bJ%C‡‰ìðövÖö«Ð¶q°·*F¶³žZ¯øHa¼cw7u1H±A +‹Çq·‹AL4®¿%ó +Ù&u˜Ù¥OEJäTŠHRY‡ôHýîÓ—ü#ûYaèL±Ç¾ôˆ ßµ­i Ý«‹¾¥VLÕDµCÿ®«‘÷ïGàžÆ‡\/^¥Uw‹ë¯»‡¼ç¬Ô)¶˜¹sxñóÖbÿƒŽ¬15÷?hGèØÄK’j +08†Â¥YÀ¤ãzKñ»ÓÕ|`'Ää,û€Q¿ÿeú»8·‡çàòÜŒÎ-ÀøÜèÚù$øåÄGÁ•#sß\xÖLü‚\ +`¸ý¿O¿‡™øßaFN~þ™@›OÿýéwÛŸ>ýç§ïÉ'˜®ý‘NØþkû±ðdy( ¥¨t +ñÞ¿WÙÚÈvG†+ÍFÔú#f3G=ª¨ Ž$·ñ"¼¾›ä$HߘÎMÔ$R5¶¾™w€ŠfB4 ¬³i¬I`]cMfNgÓX“ ÊÑ5vvø<"›õÏj³zèbx¼Èþ::ü¹8LÀÜÑ›P±îæ÷û’=iÙ¾ˆK>¼k·.*¡ÄäŠHÛš®‡é:w„£2:?€^nü¡Xþ‡ÕÅÔ3hÿ0ƒæÎ}]>"}]>}‘¾F@_º~ö¨£ì (Á‘¦©guK/ÿUç7­¢Ÿ&Ì_z(ä°âkôì%rÌ…ë©ì†2ñ¬âÝüêž_³oRW.²«ë ¹mãøüAt“d®ðT¹ùET£tINÞeYüEuå’‹SÜU.Ã#7R&§ œÌÓ’Ç'‡ô½Bn ›šþ÷k¦ØÜ9½Saº9’s:ç±Áº¯«óõoRÝÇW7U¿ø5NÎ¤Ó a£[üÙémvC¬.¨D%O7¢àºÃ +Wâ`Ì¡0‡ÁÁ.æ0<˜ÃåÁFsÌA× +YP<ÄÉ%¶ƒl”/ÉMÄh9Ƀ)Z·?Òùmñer°ø(Ž&<­¸u„f +"RÊè›5ƒ§ +—ýT…Ëþ ªÂe Uá²?˜ªpÙPU¸ìª*\öV.ûƒ«’×¥Ìg3 †¿no½rØÑ÷Ô †’Ã.»d>‘Ñ¡x~}*K$B2‰½Šñh+SÅ(EÚRŽ©­øNþ㨫^×ÁäaÅ_+hª ƚϸh~üºAm%é]ãò,:êïБюŽúu4ÖÎãHƒv1h¨£{18‹.ÚÑÃEC=ô»úåybØŽ"†AàéõpÙŽ.êaÐ Îã£v1j¨ˆ‹®6:‹ÆíèaÜX—úyⳡ@˜®ãc3 ¬;Ε^ÑJŸÙÛ¥» ûbp¨–`áˆnF­´ãE_»îüãûOX튔ڃµà)r+®vNxÚzÓªl¥m(¶Ò´‚ýZjÛC€s­4í ´VÚö0@WKM“8ªe58%ŽH%q”ÄQGI%q”ÄQG=uqJu!q”ÄQGI%q”ÄQGIõtpÔð”8j(q”ÄQGI%q”ÄQGIõtpÔå)qÔåIpTáGÂ( £$Œ’0JÂ( £$Œ’0ª)ŒFär”ÄQGI%q”ÄQGIõtpÔø”8j,q”ÄQGI%q”ÄQGIõtpiè途ø&h«HêrP¹+“HJ")‰¤$’’HJ")‰¤$’Ú¤7À>¹&|fÍC–ë(q†jÚÈ÷¯;3× +Èçârd„¼@½CvHÐJ”È úä¾p‹0'ׂÏqªL ÍTÂoêšá2¹¿ºØ™–ÉhË(Ô@®\Nä(ª‰fª„ÎoS§9îlæã€e0›Ë]:Š˜$º°ñ,ˆò,Çô0i8©ˆdÏzÀÙ2£ Ó}’% 0p¯eªqVùÝõorÏ<ä®u‡ìÜkh©¯1šboç“3¶íªýÒÔÈÿNö q-z/ÝFÎ<«_w¼°ÃÊ…Nà(oßu² ”¿1þ*4­)Rnã+ïËt§XO§$×2’§Ÿ ¹E P˜‘/ž}Êíœ^Ís±¬'ïqOðù#§]¿Ì&k½KT}~˜›öóÎk×£óLêít©kÊ_6\»mOÆÍŸŸ¢oïrä–Ÿõ²å§oòö–EåÛný}=ï}fî÷s©WŸÙþ»>¯÷´`ÿÔ­|é[s*o¿Ør¯9ûî>©„éɹõW¦m®ÒðÝÆ›SöîHþ—“Ç+N¿Øbcò.&-^ÉÎä¹[¯Ÿ×¾¶ùѶí‹™›f½0ݸuÏ‹‚ý›Ö]tX½‡M.;ÑwcÕ¤C^Ä?D¨Ÿ’hê“MôØ¡Êé9™É—%^«ƒö=ŠÍ¢Ç>ÑÇb'ó0‘¨ Í•6´x xJó ]‡Ž4_Q–ƒja+ж <†Qö â€6"à'Ž\ +ÚŠh¢XÐßó¨ÇbPÖ×L²©Q§ÚQCJ‘Ýñ˜HÅøÒíX +wðe‘ÙShˆø f°ØôÄ4|­5¹djáUXzJœŽÖm3Äø‰Á [ …$[(\ž1¨\¬÷Œ¯(ðÚ—aS0ùªÛ¨,uµ˜‘ê ÃøR¢IìæütÕAö…(ÅJO—ÙVô—z?ÄÄ-®@þ¾Ï ’‰íÌYáDZXÒ;µÊ“aN›\ôkB +†Ÿ‰6|¼°i¥_¸™þb2a¢©€½ºNeâ>BÄJ¨Ý~)ö’Ã~Ͳ[`²‰ÅÕíú”³¬@£Hìº +m´+B×w*ËË 4Yð:Q˜ÈWm.pY\Xm±‘Þ^º«¨c ^-ŧ´Ÿ\ÙÞV¶>^®m}ÙmüPKd= ÁPK×.f8META-INF/manifest.xmlµ—ßr£ Åïûï£@£Ó¤#þ¹Þ‹îPCRfnóö‹É¤íÚLg»›ÏpFÏóqP¸xí»Å‹Ôjà ¡Z½“ê° ~>6Ëu𰽻﹒{al~é,ü{ʼÝn7ª\s#M®x/LnÛ\Bítëz¡lþçóùDÚÞ-Þ…÷²Kÿàx\¼ÃÄNò¥=bðaèdË­gô¢vá‰~D„V¼Úàýí½ëºåÀíó&ˆ‚è[°ë*¥V{ypãi†DÆrëÌaäyÛŠNø[=F­ÇÉ¢¯"8 °ï4·H|Ѓ|ü¨£0p3= +LÜj݉˞„‰˜´= (ã›Úóï…qjZ=¡“aûðwc¸‰±²µÎ)"È_1.¦f•Ðfj Ž×FëUÓðW¿ ’ÕúLdõÔâ&Á­h‰’19ãš]ˆ´®|§Ä@Ä×óª6©·X1å‘â¹Ç 5IVÌ#™{,hM3šÕP=“äâ±öQ-3Z€e5žgµ"¤Be—Õt>UA²&‹("^Ï«Zá„eeVe•Ì=â$-«†A%'ö‹a–ULŠÊ#b'o¤Á§u‰½¹¢a £t +E,ê9±Š Šë +l?'§^!FŒÀ<Æsþÿ“¤€ú †?UµÆ)K@Vÿcsñ$×õ;~ÔÎ.[Þ>‹o"¦ÃL4m÷¯ +û-Œý·óÀ׺Æ;an.Û Ëovvy|vý“â²3‘½tÃAn-~Û +ký™ú­´÷ѧ#õö7PKëŠxtSPK×.f8^Æ2 ''mimetypePK×.f8MConfigurations2/statusbar/PK×.f8'…Configurations2/accelerator/current.xmlPK×.f8ÜConfigurations2/floater/PK×.f8Configurations2/popupmenu/PK×.f8JConfigurations2/progressbar/PK×.f8„Configurations2/menubar/PK×.f8ºConfigurations2/toolbar/PK×.f8ðConfigurations2/images/Bitmaps/PK×.f8A¢ˆ|" |T--Pictures/2000041A0000356F0000214891083746.wmfPK×.f8–˜+¹è(2-ªPictures/20000238000035BE00001F511036C053.wmfPK×.f8`”<6 +”4-íPictures/20000258000034EB00001F516ED001C1.wmfPK×.f8‰×ïU% ¤T-~$Pictures/2000041E0000356F00002148F76C0DB2.wmfPK×.f8eW~Ä +\5-þ0Pictures/20000261000034EB00001F5190F59A27.wmfPK×.f8ªæm“F |T-?Pictures/200004120000356F00002148A6E6969E.wmfPK×.f8¬ý-ü\"--¾KPictures/200002060000355500001F51E083C96A.wmfPK×.f87oâØ1-uRPictures/20000234000035BE00001F51D22D0CD3.wmfPK×.f8€‰n:MŠ4-²ZPictures/20000257000034EB00001F51DA29F945.wmfPK×.f8W}†ö˜ l.-ZiPictures/200002180000355500001F51D15B9C9D.wmfPK×.f8ˆU\ Å +f5-MsPictures/20000262000034EB00001F51157CDFBE.wmfPK×.f8³Âž‰šT-mPictures/200004190000356F0000214816F2BAAD.wmfPK×.f8ˆÑIØlX-Q’Pictures/200000BB00002F1100001DFBAFB5B668.wmfPK×.f8\Ýn€èT-„šPictures/200000AE00002F1100001DFBD4204EDD.wmfPK×.f8õ +üê3b.-_¢Pictures/200002180000355500001F51E30B6F10.wmfPK×.f8IÓ$@R-íªPictures/200000A400002F1100001DFB1A0425AA.wmfPK×.f8ü]œˆU-ˆ²Pictures/200000B100002F1100001DFBDE17B70E.wmfPK×.f8ƒ<¥Œg ºlayout-cachePK×.f8Âß–Xkû »content.xmlPK×.f8‹8ÌûåÄè +ïstyles.xmlPK×.f8Ìùx{3 'meta.xmlPK×.f8P¿(·§u)Thumbnails/thumbnail.pngPK×.f8d= Á r,settings.xmlPK×.f8ëŠxtSm1META-INF/manifest.xmlPK!!3 +4 \ No newline at end of file
hssdrc/trunk/doc/hssdrc_design_document_rev10.odt Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/doc/hssdrc_design_document.pdf =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: hssdrc/trunk/doc/hssdrc_design_document.pdf =================================================================== --- hssdrc/trunk/doc/hssdrc_design_document.pdf (nonexistent) +++ hssdrc/trunk/doc/hssdrc_design_document.pdf (revision 3)
hssdrc/trunk/doc/hssdrc_design_document.pdf Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: hssdrc/trunk/core/test.v =================================================================== --- hssdrc/trunk/core/test.v (nonexistent) +++ hssdrc/trunk/core/test.v (revision 3) @@ -0,0 +1,367 @@ +// Testbench for Micron SDR SDRAM Verilog models + +`timescale 1ns / 1ps + +module test; + +reg [31 : 0] dq; // SDRAM I/O +reg [10 : 0] addr; // SDRAM Address +reg [1 : 0] ba; // Bank Address +reg clk; // Clock +reg cke; // Synchronous Clock Enable +reg cs_n; // CS# +reg ras_n; // RAS# +reg cas_n; // CAS# +reg we_n; // WE# +reg [3 : 0] dqm; // I/O Mask + +wire [31 : 0] DQ = dq; + +parameter hi_z = 32'bz; // Hi-Z + +parameter tCK = 10; // Clock Period + +mt48lc2m32b2 sdram0 (DQ, addr, ba, clk, cke, cs_n, ras_n, cas_n, we_n, dqm); + +initial begin + clk = 1'b0; + cke = 1'b0; + cs_n = 1'b1; + dq = hi_z; +end + +always #5 clk = ~clk; + +/* +always @ (posedge clk) begin + $strobe("at time %t clk=%b cke=%b CS#=%b RAS#=%b CAS#=%b WE#=%b dqm=%b addr=%b ba=%b DQ=%d", + $time, clk, cke, cs_n, ras_n, cas_n, we_n, dqm, addr, ba, DQ); +end +*/ + +task active; + input [1 : 0] bank; + input [10 : 0] row; + input [31 : 0] dq_in; + begin + cke = 1; + cs_n = 0; + ras_n = 0; + cas_n = 1; + we_n = 1; + dqm = 0; + ba = bank; + addr = row; + dq = dq_in; + end +endtask + +task auto_refresh; + begin + cke = 1; + cs_n = 0; + ras_n = 0; + cas_n = 0; + we_n = 1; + dqm = 0; + //ba = 0; + //addr = 0; + dq = hi_z; + end +endtask + +task burst_term; + input [31 : 0] dq_in; + begin + cke = 1; + cs_n = 0; + ras_n = 1; + cas_n = 1; + we_n = 0; + dqm = 0; + //ba = 0; + //addr = 0; + dq = dq_in; + end +endtask + +task load_mode_reg; + input [10 : 0] op_code; + begin + cke = 1; + cs_n = 0; + ras_n = 0; + cas_n = 0; + we_n = 0; + dqm = 0; + ba = 0; + addr = op_code; + dq = hi_z; + end +endtask + +task nop; + input [3 : 0] dqm_in; + input [31 : 0] dq_in; + begin + cke = 1; + cs_n = 0; + ras_n = 1; + cas_n = 1; + we_n = 1; + dqm = dqm_in; + //ba = 0; + //addr = 0; + dq = dq_in; + end +endtask + +task precharge_bank_0; + input [3 : 0] dqm_in; + input [31 : 0] dq_in; + begin + cke = 1; + cs_n = 0; + ras_n = 0; + cas_n = 1; + we_n = 0; + dqm = dqm_in; + ba = 0; + addr = 0; + dq = dq_in; + end +endtask + +task precharge_bank_1; + input [3 : 0] dqm_in; + input [31 : 0] dq_in; + begin + cke = 1; + cs_n = 0; + ras_n = 0; + cas_n = 1; + we_n = 0; + dqm = dqm_in; + ba = 1; + addr = 0; + dq = dq_in; + end +endtask + +task precharge_bank_2; + input [3 : 0] dqm_in; + input [31 : 0] dq_in; + begin + cke = 1; + cs_n = 0; + ras_n = 0; + cas_n = 1; + we_n = 0; + dqm = dqm_in; + ba = 2; + addr = 0; + dq = dq_in; + end +endtask + +task precharge_bank_3; + input [3 : 0] dqm_in; + input [31 : 0] dq_in; + begin + cke = 1; + cs_n = 0; + ras_n = 0; + cas_n = 1; + we_n = 0; + dqm = dqm_in; + ba = 3; + addr = 0; + dq = dq_in; + end +endtask + +task precharge_all_bank; + input [3 : 0] dqm_in; + input [31 : 0] dq_in; + begin + cke = 1; + cs_n = 0; + ras_n = 0; + cas_n = 1; + we_n = 0; + dqm = dqm_in; + ba = 0; + addr = 1024; // A10 = 1 + dq = dq_in; + end +endtask + +task read; + input [1 : 0] bank; + input [10 : 0] column; + input [31 : 0] dq_in; + input [3 : 0] dqm_in; + begin + cke = 1; + cs_n = 0; + ras_n = 1; + cas_n = 0; + we_n = 1; + dqm = dqm_in; + ba = bank; + addr = column; + dq = dq_in; + end +endtask + +task write; + input [1 : 0] bank; + input [10 : 0] column; + input [31 : 0] dq_in; + input [3 : 0] dqm_in; + begin + cke = 1; + cs_n = 0; + ras_n = 1; + cas_n = 0; + we_n = 0; + dqm = dqm_in; + ba = bank; + addr = column; + dq = dq_in; + end +endtask + +initial begin + begin + // Initialize + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; precharge_all_bank(0, hi_z); // Precharge ALL Bank + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; auto_refresh; // Auto Refresh + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; auto_refresh; // Auto Refresh + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; load_mode_reg (50); // Load Mode: Lat = 3, BL = 4, Seq + #tCK; nop (0, hi_z); // Nop + + // Write with auto precharge to bank 0 (non-interrupt) + #tCK; active (0, 0, hi_z); // Active: Bank = 0, Row = 0 + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; write (0, 1024, 100, 0); // Write : Bank = 0, Col = 0, Dqm = 0, Auto Precharge + #tCK; nop (0, 101); // Nop + #tCK; nop (0, 102); // Nop + #tCK; nop (0, 103); // Nop + #tCK; nop (0, hi_z); // Nop + + // Write with auto precharge to bank 1 (non-interrupt) + #tCK; active (1, 0, hi_z); // Active: Bank = 1, Row = 0 + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; write (1, 1024, 200, 0); // Write : Bank = 1, Col = 0, Dqm = 0, Auto precharge + #tCK; nop (0, 201); // Nop + #tCK; nop (0, 202); // Nop + #tCK; nop (0, 203); // Nop + #tCK; nop (0, hi_z); // Nop + + // Write with auto precharge to bank 2 (non-interrupt) + #tCK; active (2, 0, hi_z); // Active: Bank = 2, Row = 0 + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; write (2, 1024, 300, 0); // Write : Bank = 2, Col = 0, Dqm = 0, Auto Precharge + #tCK; nop (0, 301); // Nop + #tCK; nop (0, 302); // Nop + #tCK; nop (0, 303); // Nop + #tCK; nop (0, hi_z); // Nop + + // Write with auto precharge to bank 3 (non-interrupt) + #tCK; active (3, 0, hi_z); // Active: Bank = 3, Row = 0 + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; write (3, 1024, 400, 0); // Write : Bank = 3, Col = 0, Dqm = 0, Auto precharge + #tCK; nop (0, 401); // Nop + #tCK; nop (0, 402); // Nop + #tCK; nop (0, 403); // Nop + #tCK; nop (0, hi_z); // Nop + + // Read with auto precharge to bank 0 (non-interrupt) + #tCK; active (0, 0, hi_z); // Active: Bank = 0, Row = 0 + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; read (0, 1024, hi_z, 0); // Read : Bank = 0, Col = 0, Dqm = 0, Auto precharge + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + + // Read with auto precharge to bank 1 (non-interrupt) + #tCK; active (1, 0, hi_z); // Active: Bank = 1, Row = 0 + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; read (1, 1024, hi_z, 0); // Read : Bank = 1, Col = 0, Dqm = 0, Auto precharge + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + + // Read with auto precharge to bank 2 (non-interrupt) + #tCK; active (2, 0, hi_z); // Active: Bank = 2, Row = 0 + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; read (2, 1024, hi_z, 0); // Read : Bank = 2, Col = 0, Dqm = 0, Auto precharge + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + + // Read with auto precharge to bank 3 (non-interrupt) + #tCK; active (3, 0, hi_z); // Active: Bank = 3, Row = 0 + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; read (3, 1024, hi_z, 0); // Read : Bank = 3, Col = 0, Dqm = 0, Auto precharge + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; nop (0, hi_z); // Nop + #tCK; + end +$stop; +$finish; +end + +endmodule + +
hssdrc/trunk/core/test.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/core/mt48lc2m32b2.v =================================================================== --- hssdrc/trunk/core/mt48lc2m32b2.v (nonexistent) +++ hssdrc/trunk/core/mt48lc2m32b2.v (revision 3) @@ -0,0 +1,1096 @@ +/************************************************************************** +* +* File Name: MT48LC2M32B2.V +* Version: 2.1 +* Date: June 6th, 2002 +* Model: BUS Functional +* Simulator: Model Technology +* +* Dependencies: None +* +* Email: modelsupport@micron.com +* Company: Micron Technology, Inc. +* Model: MT48LC2M32B2 (512K x 32 x 4 Banks) +* +* Description: Micron 64Mb SDRAM Verilog model +* +* Limitation: - Doesn't check for 4096 cycle refresh +* +* Note: - Set simulator resolution to "ps" accuracy +* - Set Debug = 0 to disable $display messages +* +* Disclaimer: THESE DESIGNS ARE PROVIDED "AS IS" WITH NO WARRANTY +* WHATSOEVER AND MICRON SPECIFICALLY DISCLAIMS ANY +* IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR +* A PARTICULAR PURPOSE, OR AGAINST INFRINGEMENT. +* +* Copyright © 2001 Micron Semiconductor Products, Inc. +* All rights researved +* +* Rev Author Date Changes +* --- -------------------------- --------------------------------------- +* 2.1 SH 06/06/2002 - Typo in bank multiplex +* Micron Technology Inc. +* +* 2.0 SH 04/30/2002 - Second release +* Micron Technology Inc. +* +**************************************************************************/ + +`timescale 1ns / 1ps + +module mt48lc2m32b2 (Dq, Addr, Ba, Clk, Cke, Cs_n, Ras_n, Cas_n, We_n, Dqm); + + parameter addr_bits = 11; + parameter data_bits = 32; + parameter col_bits = 8; + parameter mem_sizes = 524287; + + inout [data_bits - 1 : 0] Dq; + input [addr_bits - 1 : 0] Addr; + input [1 : 0] Ba; + input Clk; + input Cke; + input Cs_n; + input Ras_n; + input Cas_n; + input We_n; + input [3 : 0] Dqm; + + reg [data_bits - 1 : 0] Bank0 [0 : mem_sizes]; + reg [data_bits - 1 : 0] Bank1 [0 : mem_sizes]; + reg [data_bits - 1 : 0] Bank2 [0 : mem_sizes]; + reg [data_bits - 1 : 0] Bank3 [0 : mem_sizes]; + + reg [1 : 0] Bank_addr [0 : 3]; // Bank Address Pipeline + reg [col_bits - 1 : 0] Col_addr [0 : 3]; // Column Address Pipeline + reg [3 : 0] Command [0 : 3]; // Command Operation Pipeline + reg [3 : 0] Dqm_reg0, Dqm_reg1; // DQM Operation Pipeline + reg [addr_bits - 1 : 0] B0_row_addr, B1_row_addr, B2_row_addr, B3_row_addr; + + reg [addr_bits - 1 : 0] Mode_reg; + reg [data_bits - 1 : 0] Dq_reg, Dq_dqm; + reg [col_bits - 1 : 0] Col_temp, Burst_counter; + + reg Act_b0, Act_b1, Act_b2, Act_b3; // Bank Activate + reg Pc_b0, Pc_b1, Pc_b2, Pc_b3; // Bank Precharge + + reg [1 : 0] Bank_precharge [0 : 3]; // Precharge Command + reg A10_precharge [0 : 3]; // Addr[10] = 1 (All banks) + reg Auto_precharge [0 : 3]; // RW Auto Precharge (Bank) + reg Read_precharge [0 : 3]; // R Auto Precharge + reg Write_precharge [0 : 3]; // W Auto Precharge + reg RW_interrupt_read [0 : 3]; // RW Interrupt Read with Auto Precharge + reg RW_interrupt_write [0 : 3]; // RW Interrupt Write with Auto Precharge + reg [1 : 0] RW_interrupt_bank; // RW Interrupt Bank + integer RW_interrupt_counter [0 : 3]; // RW Interrupt Counter + integer Count_precharge [0 : 3]; // RW Auto Precharge Counter + + reg Data_in_enable; + reg Data_out_enable; + + reg [1 : 0] Bank, Prev_bank; + reg [addr_bits - 1 : 0] Row; + reg [col_bits - 1 : 0] Col, Col_brst; + + // Internal system clock + reg CkeZ, Sys_clk; + + // Commands Decode + wire Active_enable = ~Cs_n & ~Ras_n & Cas_n & We_n; + wire Aref_enable = ~Cs_n & ~Ras_n & ~Cas_n & We_n; + wire Burst_term = ~Cs_n & Ras_n & Cas_n & ~We_n; + wire Mode_reg_enable = ~Cs_n & ~Ras_n & ~Cas_n & ~We_n; + wire Prech_enable = ~Cs_n & ~Ras_n & Cas_n & ~We_n; + wire Read_enable = ~Cs_n & Ras_n & ~Cas_n & We_n; + wire Write_enable = ~Cs_n & Ras_n & ~Cas_n & ~We_n; + + // Burst Length Decode + wire Burst_length_1 = ~Mode_reg[2] & ~Mode_reg[1] & ~Mode_reg[0]; + wire Burst_length_2 = ~Mode_reg[2] & ~Mode_reg[1] & Mode_reg[0]; + wire Burst_length_4 = ~Mode_reg[2] & Mode_reg[1] & ~Mode_reg[0]; + wire Burst_length_8 = ~Mode_reg[2] & Mode_reg[1] & Mode_reg[0]; + wire Burst_length_f = Mode_reg[2] & Mode_reg[1] & Mode_reg[0]; + + // CAS Latency Decode + wire Cas_latency_1 = ~Mode_reg[6] & ~Mode_reg[5] & Mode_reg[4]; + wire Cas_latency_2 = ~Mode_reg[6] & Mode_reg[5] & ~Mode_reg[4]; + wire Cas_latency_3 = ~Mode_reg[6] & Mode_reg[5] & Mode_reg[4]; + + // Write Burst Mode + wire Write_burst_mode = Mode_reg[9]; + + wire Debug = 1'b1; // Debug messages : 1 = On + wire Dq_chk = Sys_clk & Data_in_enable; // Check setup/hold time for DQ + + assign Dq = Dq_reg; // DQ buffer + + // Commands Operation + `define ACT 0 + `define NOP 1 + `define READ 2 + `define WRITE 3 + `define PRECH 4 + `define A_REF 5 + `define BST 6 + `define LMR 7 + + // Timing Parameters for -6 CL3 + parameter tAC = 5.5; + parameter tHZ = 5.5; + parameter tOH = 2.5; + parameter tMRD = 2.0; // 2 Clk Cycles + parameter tRAS = 42.0; + parameter tRC = 60.0; + parameter tRCD = 18.0; + parameter tRFC = 60.0; + parameter tRP = 18.0; + parameter tRRD = 12.0; + parameter tWRa = 6.0; // A2 Version - Auto precharge mode (1 Clk + 7 ns) + parameter tWRm = 12.0; // A2 Version - Manual precharge mode (14 ns) + + // Timing Check variable + time MRD_chk; + time WR_chkm [0 : 3]; + time RFC_chk, RRD_chk; + time RC_chk0, RC_chk1, RC_chk2, RC_chk3; + time RAS_chk0, RAS_chk1, RAS_chk2, RAS_chk3; + time RCD_chk0, RCD_chk1, RCD_chk2, RCD_chk3; + time RP_chk0, RP_chk1, RP_chk2, RP_chk3; + + initial begin + Dq_reg = {data_bits{1'bz}}; + Data_in_enable = 0; Data_out_enable = 0; + Act_b0 = 1; Act_b1 = 1; Act_b2 = 1; Act_b3 = 1; + Pc_b0 = 0; Pc_b1 = 0; Pc_b2 = 0; Pc_b3 = 0; + WR_chkm[0] = 0; WR_chkm[1] = 0; WR_chkm[2] = 0; WR_chkm[3] = 0; + RW_interrupt_read[0] = 0; RW_interrupt_read[1] = 0; RW_interrupt_read[2] = 0; RW_interrupt_read[3] = 0; + RW_interrupt_write[0] = 0; RW_interrupt_write[1] = 0; RW_interrupt_write[2] = 0; RW_interrupt_write[3] = 0; + MRD_chk = 0; RFC_chk = 0; RRD_chk = 0; + RAS_chk0 = 0; RAS_chk1 = 0; RAS_chk2 = 0; RAS_chk3 = 0; + RCD_chk0 = 0; RCD_chk1 = 0; RCD_chk2 = 0; RCD_chk3 = 0; + RC_chk0 = 0; RC_chk1 = 0; RC_chk2 = 0; RC_chk3 = 0; + RP_chk0 = 0; RP_chk1 = 0; RP_chk2 = 0; RP_chk3 = 0; + $timeformat (-9, 1, " ns", 12); + end + + // System clock generator + always begin + @ (posedge Clk) begin + Sys_clk = CkeZ; + CkeZ = Cke; + end + @ (negedge Clk) begin + Sys_clk = 1'b0; + end + end + + always @ (posedge Sys_clk) begin + // Internal Commamd Pipelined + Command[0] = Command[1]; + Command[1] = Command[2]; + Command[2] = Command[3]; + Command[3] = `NOP; + + Col_addr[0] = Col_addr[1]; + Col_addr[1] = Col_addr[2]; + Col_addr[2] = Col_addr[3]; + Col_addr[3] = {col_bits{1'b0}}; + + Bank_addr[0] = Bank_addr[1]; + Bank_addr[1] = Bank_addr[2]; + Bank_addr[2] = Bank_addr[3]; + Bank_addr[3] = 2'b0; + + Bank_precharge[0] = Bank_precharge[1]; + Bank_precharge[1] = Bank_precharge[2]; + Bank_precharge[2] = Bank_precharge[3]; + Bank_precharge[3] = 2'b0; + + A10_precharge[0] = A10_precharge[1]; + A10_precharge[1] = A10_precharge[2]; + A10_precharge[2] = A10_precharge[3]; + A10_precharge[3] = 1'b0; + + // Dqm pipeline for Read + Dqm_reg0 = Dqm_reg1; + Dqm_reg1 = Dqm; + + // Read or Write with Auto Precharge Counter + if (Auto_precharge[0] === 1'b1) begin + Count_precharge[0] = Count_precharge[0] + 1; + end + if (Auto_precharge[1] === 1'b1) begin + Count_precharge[1] = Count_precharge[1] + 1; + end + if (Auto_precharge[2] === 1'b1) begin + Count_precharge[2] = Count_precharge[2] + 1; + end + if (Auto_precharge[3] === 1'b1) begin + Count_precharge[3] = Count_precharge[3] + 1; + end + + // Read or Write Interrupt Counter + if (RW_interrupt_write[0] === 1'b1) begin + RW_interrupt_counter[0] = RW_interrupt_counter[0] + 1; + end + if (RW_interrupt_write[1] === 1'b1) begin + RW_interrupt_counter[1] = RW_interrupt_counter[1] + 1; + end + if (RW_interrupt_write[2] === 1'b1) begin + RW_interrupt_counter[2] = RW_interrupt_counter[2] + 1; + end + if (RW_interrupt_write[3] === 1'b1) begin + RW_interrupt_counter[3] = RW_interrupt_counter[3] + 1; + end + + // tMRD Counter + MRD_chk = MRD_chk + 1; + + // Auto Refresh + if (Aref_enable === 1'b1) begin + if (Debug) begin + $display ("%m : at time %t AREF : Auto Refresh", $time); + end + + // Auto Refresh to Auto Refresh + if ($time - RFC_chk < tRFC) begin + $display ("%m : at time %t ERROR: tRFC violation during Auto Refresh", $time); + end + + // Precharge to Auto Refresh + if (($time - RP_chk0 < tRP) || ($time - RP_chk1 < tRP) || + ($time - RP_chk2 < tRP) || ($time - RP_chk3 < tRP)) begin + $display ("%m : at time %t ERROR: tRP violation during Auto Refresh", $time); + end + + // Precharge to Refresh + if (Pc_b0 === 1'b0 || Pc_b1 === 1'b0 || Pc_b2 === 1'b0 || Pc_b3 === 1'b0) begin + $display ("%m : at time %t ERROR: All banks must be Precharge before Auto Refresh", $time); + end + + // Load Mode Register to Auto Refresh + if (MRD_chk < tMRD) begin + $display ("%m : at time %t ERROR: tMRD violation during Auto Refresh", $time); + end + + // Record Current tRFC time + RFC_chk = $time; + end + + // Load Mode Register + if (Mode_reg_enable === 1'b1) begin + // Register Mode + Mode_reg = Addr; + + // Decode CAS Latency, Burst Length, Burst Type, and Write Burst Mode + if (Debug) begin + $display ("%m : at time %t LMR : Load Mode Register", $time); + // CAS Latency + case (Addr[6 : 4]) + 3'b001 : $display ("%m : CAS Latency = 1"); + 3'b010 : $display ("%m : CAS Latency = 2"); + 3'b011 : $display ("%m : CAS Latency = 3"); + default : $display ("%m : CAS Latency = Reserved"); + endcase + + // Burst Length + case (Addr[2 : 0]) + 3'b000 : $display ("%m : Burst Length = 1"); + 3'b001 : $display ("%m : Burst Length = 2"); + 3'b010 : $display ("%m : Burst Length = 4"); + 3'b011 : $display ("%m : Burst Length = 8"); + 3'b111 : $display ("%m : Burst Length = Full"); + default : $display ("%m : Burst Length = Reserved"); + endcase + + // Burst Type + if (Addr[3] === 1'b0) begin + $display ("%m : Burst Type = Sequential"); + end else if (Addr[3] === 1'b1) begin + $display ("%m : Burst Type = Interleaved"); + end else begin + $display ("%m : Burst Type = Reserved"); + end + + // Write Burst Mode + if (Addr[9] === 1'b0) begin + $display ("%m : Write Burst Mode = Programmed Burst Length"); + end else if (Addr[9] === 1'b1) begin + $display ("%m : Write Burst Mode = Single Location Access"); + end else begin + $display ("%m : Write Burst Mode = Reserved"); + end + end + + // Precharge to Load Mode Register + if (Pc_b0 === 1'b0 && Pc_b1 === 1'b0 && Pc_b2 === 1'b0 && Pc_b3 === 1'b0) begin + $display ("%m : at time %t ERROR: all banks must be Precharge before Load Mode Register", $time); + end + + // Precharge to Load Mode Register + if (($time - RP_chk0 < tRP) || ($time - RP_chk1 < tRP) || + ($time - RP_chk2 < tRP) || ($time - RP_chk3 < tRP)) begin + $display ("%m : at time %t ERROR: tRP violation during Load Mode Register", $time); + end + + // Auto Refresh to Load Mode Register + if ($time - RFC_chk < tRFC) begin + $display ("%m : at time %t ERROR: tRFC violation during Load Mode Register", $time); + end + + // Load Mode Register to Load Mode Register + if (MRD_chk < tMRD) begin + $display ("%m : at time %t ERROR: tMRD violation during Load Mode Register", $time); + end + + // Reset MRD Counter + MRD_chk = 0; + end + + // Active Block (Latch Bank Address and Row Address) + if (Active_enable === 1'b1) begin + // Activate an open bank can corrupt data + if ((Ba === 2'b00 && Act_b0 === 1'b1) || (Ba === 2'b01 && Act_b1 === 1'b1) || + (Ba === 2'b10 && Act_b2 === 1'b1) || (Ba === 2'b11 && Act_b3 === 1'b1)) begin + $display ("%m : at time %t ERROR: Bank already activated -- data can be corrupted", $time); + end + + // Activate Bank 0 + if (Ba === 2'b00 && Pc_b0 === 1'b1) begin + // Debug Message + if (Debug) begin + $display ("%m : at time %t ACT : Bank = 0 Row = %d", $time, Addr); + end + + // ACTIVE to ACTIVE command period + if ($time - RC_chk0 < tRC) begin + $display ("%m : at time %t ERROR: tRC violation during Activate bank 0", $time); + end + + // Precharge to Activate Bank 0 + if ($time - RP_chk0 < tRP) begin + $display ("%m : at time %t ERROR: tRP violation during Activate bank 0", $time); + end + + // Record variables + Act_b0 = 1'b1; + Pc_b0 = 1'b0; + B0_row_addr = Addr [addr_bits - 1 : 0]; + RAS_chk0 = $time; + RC_chk0 = $time; + RCD_chk0 = $time; + end + + if (Ba == 2'b01 && Pc_b1 == 1'b1) begin + // Debug Message + if (Debug) begin + $display ("%m : at time %t ACT : Bank = 1 Row = %d", $time, Addr); + end + + // ACTIVE to ACTIVE command period + if ($time - RC_chk1 < tRC) begin + $display ("%m : at time %t ERROR: tRC violation during Activate bank 1", $time); + end + + // Precharge to Activate Bank 1 + if ($time - RP_chk1 < tRP) begin + $display ("%m : at time %t ERROR: tRP violation during Activate bank 1", $time); + end + + // Record variables + Act_b1 = 1'b1; + Pc_b1 = 1'b0; + B1_row_addr = Addr [addr_bits - 1 : 0]; + RAS_chk1 = $time; + RC_chk1 = $time; + RCD_chk1 = $time; + end + + if (Ba == 2'b10 && Pc_b2 == 1'b1) begin + // Debug Message + if (Debug) begin + $display ("%m : at time %t ACT : Bank = 2 Row = %d", $time, Addr); + end + + // ACTIVE to ACTIVE command period + if ($time - RC_chk2 < tRC) begin + $display ("%m : at time %t ERROR: tRC violation during Activate bank 2", $time); + end + + // Precharge to Activate Bank 2 + if ($time - RP_chk2 < tRP) begin + $display ("%m : at time %t ERROR: tRP violation during Activate bank 2", $time); + end + + // Record variables + Act_b2 = 1'b1; + Pc_b2 = 1'b0; + B2_row_addr = Addr [addr_bits - 1 : 0]; + RAS_chk2 = $time; + RC_chk2 = $time; + RCD_chk2 = $time; + end + + if (Ba == 2'b11 && Pc_b3 == 1'b1) begin + // Debug Message + if (Debug) begin + $display ("%m : at time %t ACT : Bank = 3 Row = %d", $time, Addr); + end + + // ACTIVE to ACTIVE command period + if ($time - RC_chk3 < tRC) begin + $display ("%m : at time %t ERROR: tRC violation during Activate bank 3", $time); + end + + // Precharge to Activate Bank 3 + if ($time - RP_chk3 < tRP) begin + $display ("%m : at time %t ERROR: tRP violation during Activate bank 3", $time); + end + + // Record variables + Act_b3 = 1'b1; + Pc_b3 = 1'b0; + B3_row_addr = Addr [addr_bits - 1 : 0]; + RAS_chk3 = $time; + RC_chk3 = $time; + RCD_chk3 = $time; + end + + // Active Bank A to Active Bank B + if ((Prev_bank != Ba) && ($time - RRD_chk < tRRD)) begin + $display ("%m : at time %t ERROR: tRRD violation during Activate bank = %d", $time, Ba); + end + + // Auto Refresh to Activate + if ($time - RFC_chk < tRFC) begin + $display ("%m : at time %t ERROR: tRFC violation during Activate bank = %d", $time, Ba); + end + + // Load Mode Register to Active + if (MRD_chk < tMRD ) begin + $display ("%m : at time %t ERROR: tMRD violation during Activate bank = %d", $time, Ba); + end + + // Record variables for checking violation + RRD_chk = $time; + Prev_bank = Ba; + end + + // Precharge Block + if (Prech_enable == 1'b1) begin + // Load Mode Register to Precharge + if ($time - MRD_chk < tMRD) begin + $display ("%m : at time %t ERROR: tMRD violaiton during Precharge", $time); + end + + // Precharge Bank 0 + if ((Addr[10] === 1'b1 || (Addr[10] === 1'b0 && Ba === 2'b00)) && Act_b0 === 1'b1) begin + Act_b0 = 1'b0; + Pc_b0 = 1'b1; + RP_chk0 = $time; + + // Activate to Precharge + if ($time - RAS_chk0 < tRAS) begin + $display ("%m : at time %t ERROR: tRAS violation during Precharge", $time); + end + + // tWR violation check for write + if ($time - WR_chkm[0] < tWRm) begin + $display ("%m : at time %t ERROR: tWR violation during Precharge", $time); + end + end + + // Precharge Bank 1 + if ((Addr[10] === 1'b1 || (Addr[10] === 1'b0 && Ba === 2'b01)) && Act_b1 === 1'b1) begin + Act_b1 = 1'b0; + Pc_b1 = 1'b1; + RP_chk1 = $time; + + // Activate to Precharge + if ($time - RAS_chk1 < tRAS) begin + $display ("%m : at time %t ERROR: tRAS violation during Precharge", $time); + end + + // tWR violation check for write + if ($time - WR_chkm[1] < tWRm) begin + $display ("%m : at time %t ERROR: tWR violation during Precharge", $time); + end + end + + // Precharge Bank 2 + if ((Addr[10] === 1'b1 || (Addr[10] === 1'b0 && Ba === 2'b10)) && Act_b2 === 1'b1) begin + Act_b2 = 1'b0; + Pc_b2 = 1'b1; + RP_chk2 = $time; + + // Activate to Precharge + if ($time - RAS_chk2 < tRAS) begin + $display ("%m : at time %t ERROR: tRAS violation during Precharge", $time); + end + + // tWR violation check for write + if ($time - WR_chkm[2] < tWRm) begin + $display ("%m : at time %t ERROR: tWR violation during Precharge", $time); + end + end + + // Precharge Bank 3 + if ((Addr[10] === 1'b1 || (Addr[10] === 1'b0 && Ba === 2'b11)) && Act_b3 === 1'b1) begin + Act_b3 = 1'b0; + Pc_b3 = 1'b1; + RP_chk3 = $time; + + // Activate to Precharge + if ($time - RAS_chk3 < tRAS) begin + $display ("%m : at time %t ERROR: tRAS violation during Precharge", $time); + end + + // tWR violation check for write + if ($time - WR_chkm[3] < tWRm) begin + $display ("%m : at time %t ERROR: tWR violation during Precharge", $time); + end + end + + // Terminate a Write Immediately (if same bank or all banks) + if (Data_in_enable === 1'b1 && (Bank === Ba || Addr[10] === 1'b1)) begin + Data_in_enable = 1'b0; + end + + // Precharge Command Pipeline for Read + if (Cas_latency_3 === 1'b1) begin + Command[2] = `PRECH; + Bank_precharge[2] = Ba; + A10_precharge[2] = Addr[10]; + end else if (Cas_latency_2 === 1'b1) begin + Command[1] = `PRECH; + Bank_precharge[1] = Ba; + A10_precharge[1] = Addr[10]; + end else if (Cas_latency_1 === 1'b1) begin + Command[0] = `PRECH; + Bank_precharge[0] = Ba; + A10_precharge[0] = Addr[10]; + end + end + + // Burst terminate + if (Burst_term === 1'b1) begin + // Terminate a Write Immediately + if (Data_in_enable == 1'b1) begin + Data_in_enable = 1'b0; + end + + // Terminate a Read Depend on CAS Latency + if (Cas_latency_3 === 1'b1) begin + Command[2] = `BST; + end else if (Cas_latency_2 == 1'b1) begin + Command[1] = `BST; + end else if (Cas_latency_1 == 1'b1) begin + Command[0] = `BST; + end + + // Display debug message + if (Debug) begin + $display ("%m : at time %t BST : Burst Terminate",$time); + end + end + + // Read, Write, Column Latch + if (Read_enable === 1'b1) begin + // Check to see if bank is open (ACT) + if ((Ba == 2'b00 && Pc_b0 == 1'b1) || (Ba == 2'b01 && Pc_b1 == 1'b1) || + (Ba == 2'b10 && Pc_b2 == 1'b1) || (Ba == 2'b11 && Pc_b3 == 1'b1)) begin + $display("%m : at time %t ERROR: Bank is not Activated for Read", $time); + end + + // Activate to Read or Write + if ((Ba == 2'b00) && ($time - RCD_chk0 < tRCD) || + (Ba == 2'b01) && ($time - RCD_chk1 < tRCD) || + (Ba == 2'b10) && ($time - RCD_chk2 < tRCD) || + (Ba == 2'b11) && ($time - RCD_chk3 < tRCD)) begin + $display("%m : at time %t ERROR: tRCD violation during Read", $time); + end + + // CAS Latency pipeline + if (Cas_latency_3 == 1'b1) begin + Command[2] = `READ; + Col_addr[2] = Addr; + Bank_addr[2] = Ba; + end else if (Cas_latency_2 == 1'b1) begin + Command[1] = `READ; + Col_addr[1] = Addr; + Bank_addr[1] = Ba; + end else if (Cas_latency_1 == 1'b1) begin + Command[0] = `READ; + Col_addr[0] = Addr; + Bank_addr[0] = Ba; + end + + // Read interrupt Write (terminate Write immediately) + if (Data_in_enable == 1'b1) begin + Data_in_enable = 1'b0; + + // Interrupting a Write with Autoprecharge + if (Auto_precharge[RW_interrupt_bank] == 1'b1 && Write_precharge[RW_interrupt_bank] == 1'b1) begin + RW_interrupt_write[RW_interrupt_bank] = 1'b1; + RW_interrupt_counter[RW_interrupt_bank] = 0; + + // Display debug message + if (Debug) begin + $display ("%m : at time %t NOTE : Read interrupt Write with Autoprecharge", $time); + end + end + end + + // Read with Auto Precharge + if (Addr[10] == 1'b1) begin + Auto_precharge[Ba] = 1'b1; + Count_precharge[Ba] = 0; + RW_interrupt_bank = Ba; + Read_precharge[Ba] = 1'b1; + end + end + + // Write Command + if (Write_enable == 1'b1) begin + // Activate to Write + if ((Ba == 2'b00 && Pc_b0 == 1'b1) || (Ba == 2'b01 && Pc_b1 == 1'b1) || + (Ba == 2'b10 && Pc_b2 == 1'b1) || (Ba == 2'b11 && Pc_b3 == 1'b1)) begin + $display("%m : at time %t ERROR: Bank is not Activated for Write", $time); + end + + // Activate to Read or Write + if ((Ba == 2'b00) && ($time - RCD_chk0 < tRCD) || + (Ba == 2'b01) && ($time - RCD_chk1 < tRCD) || + (Ba == 2'b10) && ($time - RCD_chk2 < tRCD) || + (Ba == 2'b11) && ($time - RCD_chk3 < tRCD)) begin + $display("%m : at time %t ERROR: tRCD violation during Read", $time); + end + + // Latch Write command, Bank, and Column + Command[0] = `WRITE; + Col_addr[0] = Addr; + Bank_addr[0] = Ba; + + // Write interrupt Write (terminate Write immediately) + if (Data_in_enable == 1'b1) begin + Data_in_enable = 1'b0; + + // Interrupting a Write with Autoprecharge + if (Auto_precharge[RW_interrupt_bank] == 1'b1 && Write_precharge[RW_interrupt_bank] == 1'b1) begin + RW_interrupt_write[RW_interrupt_bank] = 1'b1; + + // Display debug message + if (Debug) begin + $display ("%m : at time %t NOTE : Read Bank %d interrupt Write Bank %d with Autoprecharge", $time, Ba, RW_interrupt_bank); + end + end + end + + // Write interrupt Read (terminate Read immediately) + if (Data_out_enable == 1'b1) begin + Data_out_enable = 1'b0; + + // Interrupting a Read with Autoprecharge + if (Auto_precharge[RW_interrupt_bank] == 1'b1 && Read_precharge[RW_interrupt_bank] == 1'b1) begin + RW_interrupt_read[RW_interrupt_bank] = 1'b1; + + // Display debug message + if (Debug) begin + $display ("%m : at time %t NOTE : Write Bank %d interrupt Read Bank %d with Autoprecharge", $time, Ba, RW_interrupt_bank); + end + end + end + + // Write with Auto Precharge + if (Addr[10] == 1'b1) begin + Auto_precharge[Ba] = 1'b1; + Count_precharge[Ba] = 0; + RW_interrupt_bank = Ba; + Write_precharge[Ba] = 1'b1; + end + end + + /* + Write with Auto Precharge Calculation + The device start internal precharge when: + 1. Meet minimum tRAS requirement + and 2. tWR cycle(s) after last valid data + or 3. Interrupt by a Read or Write (with or without Auto Precharge) + + Note: Model is starting the internal precharge 1 cycle after they meet all the + requirement but tRP will be compensate for the time after the 1 cycle. + */ + if ((Auto_precharge[0] == 1'b1) && (Write_precharge[0] == 1'b1)) begin + if ((($time - RAS_chk0 >= tRAS) && // Case 1 + (((Burst_length_1 == 1'b1 || Write_burst_mode == 1'b1) && Count_precharge [0] >= 1) || // Case 2 + (Burst_length_2 == 1'b1 && Count_precharge [0] >= 2) || + (Burst_length_4 == 1'b1 && Count_precharge [0] >= 4) || + (Burst_length_8 == 1'b1 && Count_precharge [0] >= 8))) || + (RW_interrupt_write[0] == 1'b1 && RW_interrupt_counter[0] >= 1)) begin // Case 3 + Auto_precharge[0] = 1'b0; + Write_precharge[0] = 1'b0; + RW_interrupt_write[0] = 1'b0; + Pc_b0 = 1'b1; + Act_b0 = 1'b0; + RP_chk0 = $time + tWRa; + if (Debug) begin + $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 0", $time); + end + end + end + if ((Auto_precharge[1] == 1'b1) && (Write_precharge[1] == 1'b1)) begin + if ((($time - RAS_chk1 >= tRAS) && // Case 1 + (((Burst_length_1 == 1'b1 || Write_burst_mode == 1'b1) && Count_precharge [1] >= 1) || // Case 2 + (Burst_length_2 == 1'b1 && Count_precharge [1] >= 2) || + (Burst_length_4 == 1'b1 && Count_precharge [1] >= 4) || + (Burst_length_8 == 1'b1 && Count_precharge [1] >= 8))) || + (RW_interrupt_write[1] == 1'b1 && RW_interrupt_counter[1] >= 1)) begin // Case 3 + Auto_precharge[1] = 1'b0; + Write_precharge[1] = 1'b0; + RW_interrupt_write[1] = 1'b0; + Pc_b1 = 1'b1; + Act_b1 = 1'b0; + RP_chk1 = $time + tWRa; + if (Debug) begin + $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 1", $time); + end + end + end + if ((Auto_precharge[2] == 1'b1) && (Write_precharge[2] == 1'b1)) begin + if ((($time - RAS_chk2 >= tRAS) && // Case 1 + (((Burst_length_1 == 1'b1 || Write_burst_mode == 1'b1) && Count_precharge [2] >= 1) || // Case 2 + (Burst_length_2 == 1'b1 && Count_precharge [2] >= 2) || + (Burst_length_4 == 1'b1 && Count_precharge [2] >= 4) || + (Burst_length_8 == 1'b1 && Count_precharge [2] >= 8))) || + (RW_interrupt_write[2] == 1'b1 && RW_interrupt_counter[2] >= 1)) begin // Case 3 + Auto_precharge[2] = 1'b0; + Write_precharge[2] = 1'b0; + RW_interrupt_write[2] = 1'b0; + Pc_b2 = 1'b1; + Act_b2 = 1'b0; + RP_chk2 = $time + tWRa; + if (Debug) begin + $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 2", $time); + end + end + end + if ((Auto_precharge[3] == 1'b1) && (Write_precharge[3] == 1'b1)) begin + if ((($time - RAS_chk3 >= tRAS) && // Case 1 + (((Burst_length_1 == 1'b1 || Write_burst_mode == 1'b1) && Count_precharge [3] >= 1) || // Case 2 + (Burst_length_2 == 1'b1 && Count_precharge [3] >= 2) || + (Burst_length_4 == 1'b1 && Count_precharge [3] >= 4) || + (Burst_length_8 == 1'b1 && Count_precharge [3] >= 8))) || + (RW_interrupt_write[3] == 1'b1 && RW_interrupt_counter[3] >= 1)) begin // Case 3 + Auto_precharge[3] = 1'b0; + Write_precharge[3] = 1'b0; + RW_interrupt_write[3] = 1'b0; + Pc_b3 = 1'b1; + Act_b3 = 1'b0; + RP_chk3 = $time + tWRa; + if (Debug) begin + $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 3", $time); + end + end + end + + // Read with Auto Precharge Calculation + // The device start internal precharge: + // 1. Meet minimum tRAS requirement + // and 2. CAS Latency - 1 cycles before last burst + // or 3. Interrupt by a Read or Write (with or without AutoPrecharge) + if ((Auto_precharge[0] == 1'b1) && (Read_precharge[0] == 1'b1)) begin + if ((($time - RAS_chk0 >= tRAS) && // Case 1 + ((Burst_length_1 == 1'b1 && Count_precharge[0] >= 1) || // Case 2 + (Burst_length_2 == 1'b1 && Count_precharge[0] >= 2) || + (Burst_length_4 == 1'b1 && Count_precharge[0] >= 4) || + (Burst_length_8 == 1'b1 && Count_precharge[0] >= 8))) || + (RW_interrupt_read[0] == 1'b1)) begin // Case 3 + Pc_b0 = 1'b1; + Act_b0 = 1'b0; + RP_chk0 = $time; + Auto_precharge[0] = 1'b0; + Read_precharge[0] = 1'b0; + RW_interrupt_read[0] = 1'b0; + if (Debug) begin + $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 0", $time); + end + end + end + if ((Auto_precharge[1] == 1'b1) && (Read_precharge[1] == 1'b1)) begin + if ((($time - RAS_chk1 >= tRAS) && + ((Burst_length_1 == 1'b1 && Count_precharge[1] >= 1) || + (Burst_length_2 == 1'b1 && Count_precharge[1] >= 2) || + (Burst_length_4 == 1'b1 && Count_precharge[1] >= 4) || + (Burst_length_8 == 1'b1 && Count_precharge[1] >= 8))) || + (RW_interrupt_read[1] == 1'b1)) begin + Pc_b1 = 1'b1; + Act_b1 = 1'b0; + RP_chk1 = $time; + Auto_precharge[1] = 1'b0; + Read_precharge[1] = 1'b0; + RW_interrupt_read[1] = 1'b0; + if (Debug) begin + $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 1", $time); + end + end + end + if ((Auto_precharge[2] == 1'b1) && (Read_precharge[2] == 1'b1)) begin + if ((($time - RAS_chk2 >= tRAS) && + ((Burst_length_1 == 1'b1 && Count_precharge[2] >= 1) || + (Burst_length_2 == 1'b1 && Count_precharge[2] >= 2) || + (Burst_length_4 == 1'b1 && Count_precharge[2] >= 4) || + (Burst_length_8 == 1'b1 && Count_precharge[2] >= 8))) || + (RW_interrupt_read[2] == 1'b1)) begin + Pc_b2 = 1'b1; + Act_b2 = 1'b0; + RP_chk2 = $time; + Auto_precharge[2] = 1'b0; + Read_precharge[2] = 1'b0; + RW_interrupt_read[2] = 1'b0; + if (Debug) begin + $display ("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 2", $time); + end + end + end + if ((Auto_precharge[3] == 1'b1) && (Read_precharge[3] == 1'b1)) begin + if ((($time - RAS_chk3 >= tRAS) && + ((Burst_length_1 == 1'b1 && Count_precharge[3] >= 1) || + (Burst_length_2 == 1'b1 && Count_precharge[3] >= 2) || + (Burst_length_4 == 1'b1 && Count_precharge[3] >= 4) || + (Burst_length_8 == 1'b1 && Count_precharge[3] >= 8))) || + (RW_interrupt_read[3] == 1'b1)) begin + Pc_b3 = 1'b1; + Act_b3 = 1'b0; + RP_chk3 = $time; + Auto_precharge[3] = 1'b0; + Read_precharge[3] = 1'b0; + RW_interrupt_read[3] = 1'b0; + if (Debug) begin + $display("%m : at time %t NOTE : Start Internal Auto Precharge for Bank 3", $time); + end + end + end + + // Internal Precharge or Bst + if (Command[0] == `PRECH) begin // Precharge terminate a read with same bank or all banks + if (Bank_precharge[0] == Bank || A10_precharge[0] == 1'b1) begin + if (Data_out_enable == 1'b1) begin + Data_out_enable = 1'b0; + end + end + end else if (Command[0] == `BST) begin // BST terminate a read to current bank + if (Data_out_enable == 1'b1) begin + Data_out_enable = 1'b0; + end + end + + if (Data_out_enable == 1'b0) begin + Dq_reg <= #tOH {data_bits{1'bz}}; + end + + // Detect Read or Write command + if (Command[0] == `READ) begin + Bank = Bank_addr[0]; + Col = Col_addr[0]; + Col_brst = Col_addr[0]; + case (Bank_addr[0]) + 2'b00 : Row = B0_row_addr; + 2'b01 : Row = B1_row_addr; + 2'b10 : Row = B2_row_addr; + 2'b11 : Row = B3_row_addr; + endcase + Burst_counter = 0; + Data_in_enable = 1'b0; + Data_out_enable = 1'b1; + end else if (Command[0] == `WRITE) begin + Bank = Bank_addr[0]; + Col = Col_addr[0]; + Col_brst = Col_addr[0]; + case (Bank_addr[0]) + 2'b00 : Row = B0_row_addr; + 2'b01 : Row = B1_row_addr; + 2'b10 : Row = B2_row_addr; + 2'b11 : Row = B3_row_addr; + endcase + Burst_counter = 0; + Data_in_enable = 1'b1; + Data_out_enable = 1'b0; + end + + // DQ buffer (Driver/Receiver) + if (Data_in_enable == 1'b1) begin // Writing Data to Memory + // Array buffer + case (Bank) + 2'b00 : Dq_dqm = Bank0 [{Row, Col}]; + 2'b01 : Dq_dqm = Bank1 [{Row, Col}]; + 2'b10 : Dq_dqm = Bank2 [{Row, Col}]; + 2'b11 : Dq_dqm = Bank3 [{Row, Col}]; + endcase + + // Dqm operation + if (Dqm[0] == 1'b0) begin + Dq_dqm [ 7 : 0] = Dq [ 7 : 0]; + end + if (Dqm[1] == 1'b0) begin + Dq_dqm [15 : 8] = Dq [15 : 8]; + end + if (Dqm[2] == 1'b0) begin + Dq_dqm [23 : 16] = Dq [23 : 16]; + end + if (Dqm[3] == 1'b0) begin + Dq_dqm [31 : 24] = Dq [31 : 24]; + end + + // Write to memory + case (Bank) + 2'b00 : Bank0 [{Row, Col}] = Dq_dqm; + 2'b01 : Bank1 [{Row, Col}] = Dq_dqm; + 2'b10 : Bank2 [{Row, Col}] = Dq_dqm; + 2'b11 : Bank3 [{Row, Col}] = Dq_dqm; + endcase + + // Display debug message + if (Dqm !== 4'b1111) begin + // Record tWR for manual precharge + WR_chkm [Bank] = $time; + + if (Debug) begin + $display("%m : at time %t WRITE: Bank = %d Row = %d, Col = %d, Data = %h", $time, Bank, Row, Col, Dq_dqm); + end + end else begin + if (Debug) begin + $display("%m : at time %t WRITE: Bank = %d Row = %d, Col = %d, Data = Hi-Z due to DQM", $time, Bank, Row, Col); + end + end + + // Advance burst counter subroutine + #tHZ Burst_decode; + + end else if (Data_out_enable == 1'b1) begin // Reading Data from Memory + // Array buffer + case (Bank) + 2'b00 : Dq_dqm = Bank0[{Row, Col}]; + 2'b01 : Dq_dqm = Bank1[{Row, Col}]; + 2'b10 : Dq_dqm = Bank2[{Row, Col}]; + 2'b11 : Dq_dqm = Bank3[{Row, Col}]; + endcase + + // Dqm operation + if (Dqm_reg0 [0] == 1'b1) begin + Dq_dqm [ 7 : 0] = 8'bz; + end + if (Dqm_reg0 [1] == 1'b1) begin + Dq_dqm [15 : 8] = 8'bz; + end + if (Dqm_reg0 [2] == 1'b1) begin + Dq_dqm [23 : 16] = 8'bz; + end + if (Dqm_reg0 [3] == 1'b1) begin + Dq_dqm [31 : 24] = 8'bz; + end + + // Display debug message + if (Dqm_reg0 !== 4'b1111) begin + Dq_reg = #tAC Dq_dqm; + if (Debug) begin + $display("%m : at time %t READ : Bank = %d Row = %d, Col = %d, Data = %h", $time, Bank, Row, Col, Dq_reg); + end + end else begin + Dq_reg = #tHZ {data_bits{1'bz}}; + if (Debug) begin + $display("%m : at time %t READ : Bank = %d Row = %d, Col = %d, Data = Hi-Z due to DQM", $time, Bank, Row, Col); + end + end + + // Advance burst counter subroutine + Burst_decode; + end + end + + // Burst counter decode + task Burst_decode; + begin + // Advance Burst Counter + Burst_counter = Burst_counter + 1; + + // Burst Type + if (Mode_reg[3] == 1'b0) begin // Sequential Burst + Col_temp = Col + 1; + end else if (Mode_reg[3] == 1'b1) begin // Interleaved Burst + Col_temp[2] = Burst_counter[2] ^ Col_brst[2]; + Col_temp[1] = Burst_counter[1] ^ Col_brst[1]; + Col_temp[0] = Burst_counter[0] ^ Col_brst[0]; + end + + // Burst Length + if (Burst_length_2) begin // Burst Length = 2 + Col [0] = Col_temp [0]; + end else if (Burst_length_4) begin // Burst Length = 4 + Col [1 : 0] = Col_temp [1 : 0]; + end else if (Burst_length_8) begin // Burst Length = 8 + Col [2 : 0] = Col_temp [2 : 0]; + end else begin // Burst Length = FULL + Col = Col_temp; + end + + // Burst Read Single Write + if (Write_burst_mode == 1'b1) begin + Data_in_enable = 1'b0; + end + + // Data Counter + if (Burst_length_1 == 1'b1) begin + if (Burst_counter >= 1) begin + Data_in_enable = 1'b0; + Data_out_enable = 1'b0; + end + end else if (Burst_length_2 == 1'b1) begin + if (Burst_counter >= 2) begin + Data_in_enable = 1'b0; + Data_out_enable = 1'b0; + end + end else if (Burst_length_4 == 1'b1) begin + if (Burst_counter >= 4) begin + Data_in_enable = 1'b0; + Data_out_enable = 1'b0; + end + end else if (Burst_length_8 == 1'b1) begin + if (Burst_counter >= 8) begin + Data_in_enable = 1'b0; + Data_out_enable = 1'b0; + end + end + end + endtask + + // Timing Parameters for -6 CL3 + specify + specparam + tAH = 1.0, // Addr, Ba Hold Time + tAS = 1.5, // Addr, Ba Setup Time + tCH = 2.5, // Clock High-Level Width + tCL = 2.5, // Clock Low-Level Width + tCK = 6.0, // Clock Cycle Time + tDH = 1.0, // Data-in Hold Time + tDS = 1.5, // Data-in Setup Time + tCKH = 1.0, // CKE Hold Time + tCKS = 1.5, // CKE Setup Time + tCMH = 1.0, // CS#, RAS#, CAS#, WE#, DQM# Hold Time + tCMS = 1.5; // CS#, RAS#, CAS#, WE#, DQM# Setup Time + $width (posedge Clk, tCH); + $width (negedge Clk, tCL); + $period (negedge Clk, tCK); + $period (posedge Clk, tCK); + $setuphold(posedge Clk, Cke, tCKS, tCKH); + $setuphold(posedge Clk, Cs_n, tCMS, tCMH); + $setuphold(posedge Clk, Cas_n, tCMS, tCMH); + $setuphold(posedge Clk, Ras_n, tCMS, tCMH); + $setuphold(posedge Clk, We_n, tCMS, tCMH); + $setuphold(posedge Clk, Addr, tAS, tAH); + $setuphold(posedge Clk, Ba, tAS, tAH); + $setuphold(posedge Clk, Dqm, tCMS, tCMH); + $setuphold(posedge Dq_chk, Dq, tDS, tDH); + endspecify + +endmodule
hssdrc/trunk/core/mt48lc2m32b2.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/sim/compile.do =================================================================== --- hssdrc/trunk/sim/compile.do (nonexistent) +++ hssdrc/trunk/sim/compile.do (revision 3) @@ -0,0 +1,59 @@ + +set need_quit 1 +set need_del 1 + +set debug 1 + +if {$debug} { + set opt novopt +} else { + set opt O4 +} +# +#set used project dir +# +set prjdir E:/work_des00/Project/prj_10_hssdrc + +set coredir $prjdir/core +set rtldir $prjdir/rtl +set tbdir $prjdir/testbench +set incdir $prjdir/include + +if {$need_del} { + vdel -all work +} + +vlib work +# core codes +vlog $coredir/mt48lc2m32b2.v +# headers codes +# rtl codes +vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_data_path.v +vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_data_path_p1.v +vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_addr_path.v +vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_addr_path_p1.v +vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_mux.v +vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_init_state.v +vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_arbiter_out.v +vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_access_manager.v +vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_decoder_state.v +vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_decoder.v +vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_ba_map.v +vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_arbiter_in.v +vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_refr_counter.v +vlog -$opt -sv -lint -incr +incdir+$incdir+$rtldir $rtldir/hssdrc_top.v + +# tb codes +vlog -$opt -sv -lint +incdir+$incdir+$tbdir $tbdir/sdram_interpretator.sv + +vlog -$opt -sv -lint +incdir+$incdir+$tbdir $tbdir/tb_prog.sv +vlog -$opt -sv -lint +incdir+$incdir+$tbdir $tbdir/tb_top.sv + +if {$need_quit} { + quit +} + + + + +
hssdrc/trunk/sim/compile.do Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/sim/sim.do =================================================================== --- hssdrc/trunk/sim/sim.do (nonexistent) +++ hssdrc/trunk/sim/sim.do (revision 3) @@ -0,0 +1,133 @@ + +onbreak {resume} + +proc r {} { + restart -force -all +} + +transcript file "" + +set debug 1 + +if {$debug} { + set seed [clock seconds] +} else { + set seed [clock seconds] +} + +#transcript file transcript + +if {$debug} { +vsim -novopt -sv_seed $seed -wlf hssdrc_work.wlf work.tb_top + +onerror {resume} +quietly WaveActivateNextPane {} 0 + +radix hexadecimal + +add wave -noupdate -divider system +add wave -noupdate -format Logic /tb_top/clk +add wave -noupdate -format Logic /tb_top/reset +add wave -noupdate -format Logic /tb_top/sclr + +add wave -noupdate -divider sys_if_req_resp +add wave -noupdate -format Logic /tb_top/sys_write +add wave -noupdate -format Logic /tb_top/sys_read +add wave -noupdate -format Logic /tb_top/sys_refr +add wave -noupdate -format Logic /tb_top/sys_ready + +add wave -noupdate -divider sys_if_req_data +add wave -noupdate -format Literal /tb_top/sys_rowa +add wave -noupdate -format Literal /tb_top/sys_cola +add wave -noupdate -format Literal /tb_top/sys_ba +add wave -noupdate -format Literal /tb_top/sys_burst +add wave -noupdate -format Literal /tb_top/sys_chid_i + +add wave -noupdate -divider sys_if_data +add wave -noupdate -format Literal /tb_top/sys_wdata +add wave -noupdate -format Literal /tb_top/sys_wdatam +add wave -noupdate -format Logic /tb_top/sys_use_wdata + +add wave -noupdate -format Logic /tb_top/sys_chid_o +add wave -noupdate -format Literal /tb_top/sys_rdata +add wave -noupdate -format Logic /tb_top/sys_vld_rdata + +add wave -noupdate -divider sdram_if +add wave -noupdate -format Logic /tb_top/nclk +add wave -noupdate -format Literal /tb_top/inter/cmd_e +add wave -noupdate -format Literal /tb_top/dq +add wave -noupdate -format Literal /tb_top/dqm +add wave -noupdate -format Literal /tb_top/addr +add wave -noupdate -format Literal /tb_top/ba +add wave -noupdate -format Logic /tb_top/cs_n +add wave -noupdate -format Logic /tb_top/ras_n +add wave -noupdate -format Logic /tb_top/cas_n +add wave -noupdate -format Logic /tb_top/we_n + +add wave -noupdate -divider am +add wave -noupdate -format Logic /tb_top/top/access_manager/am_pre_all_enable +add wave -noupdate -format Logic /tb_top/top/access_manager/am_refr_enable +add wave -noupdate -format Literal /tb_top/top/access_manager/am_pre_enable +add wave -noupdate -format Literal /tb_top/top/access_manager/am_act_enable +add wave -noupdate -format Literal /tb_top/top/access_manager/am_read_enable +add wave -noupdate -format Literal /tb_top/top/access_manager/am_write_enable + +add wave -noupdate -divider mux +add wave -noupdate -format Logic /tb_top/top/mux/mux_pre_all +add wave -noupdate -format Logic /tb_top/top/mux/mux_refr +add wave -noupdate -format Logic /tb_top/top/mux/mux_pre +add wave -noupdate -format Logic /tb_top/top/mux/mux_act +add wave -noupdate -format Logic /tb_top/top/mux/mux_read +add wave -noupdate -format Logic /tb_top/top/mux/mux_write +add wave -noupdate -format Logic /tb_top/top/mux/mux_lmr +add wave -noupdate -format Literal /tb_top/top/mux/mux_burst + +add wave -noupdate -divider state +add wave -noupdate -format Literal /tb_top/top/decoder/state0/state +add wave -noupdate -format Literal /tb_top/top/decoder/state1/state +add wave -noupdate -format Literal /tb_top/top/decoder/state2/state + +add wave -noupdate -divider ba_map +add wave -noupdate -format Logic /tb_top/top/ba_map/update +add wave -noupdate -format Logic /tb_top/top/ba_map/clear +add wave -noupdate -format Literal /tb_top/top/ba_map/ba +add wave -noupdate -format Literal /tb_top/top/ba_map/rowa +add wave -noupdate -format Logic /tb_top/top/ba_map/pre_act_rw +add wave -noupdate -format Logic /tb_top/top/ba_map/act_rw +add wave -noupdate -format Logic /tb_top/top/ba_map/rw +add wave -noupdate -format Logic /tb_top/top/ba_map/all_close + +add wave -noupdate -divider init_state +add wave -noupdate -format Logic /tb_top/top/init_state/init_done + +add wave -noupdate -divider refr_cnt +add wave -noupdate -format Logic /tb_top/top/refr_cnt/ack +add wave -noupdate -format Logic /tb_top/top/refr_cnt/hi_req +add wave -noupdate -format Logic /tb_top/top/refr_cnt/low_req + + + +TreeUpdate [SetDefaultTree] +configure wave -namecolwidth 203 +configure wave -valuecolwidth 100 +configure wave -justifyvalue left +configure wave -signalnamewidth 0 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +update +WaveRestoreZoom {0 ps} {1000 ps} + +log -r /* + +} else { + vsim -sv_seed $seed work.tb_top + run -all + quit +} +
hssdrc/trunk/sim/sim.do Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk/readme.txt =================================================================== --- hssdrc/trunk/readme.txt (nonexistent) +++ hssdrc/trunk/readme.txt (revision 3) @@ -0,0 +1,8 @@ +Logical project decsription + +core - external not under development IP cores +doc - project documentation +include - common rtl, testbench header files +rtl - rtl models of project units +sim - simulation scripts for verivication +testbench - verification enviroment for project
hssdrc/trunk/readme.txt Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: hssdrc/trunk =================================================================== --- hssdrc/trunk (nonexistent) +++ hssdrc/trunk (revision 3)
hssdrc/trunk Property changes : Added: svn:mergeinfo ## -0,0 +0,0 ## Index: hssdrc/web_uploads =================================================================== --- hssdrc/web_uploads (nonexistent) +++ hssdrc/web_uploads (revision 3)
hssdrc/web_uploads Property changes : Added: svn:mergeinfo ## -0,0 +0,0 ## Index: hssdrc/branches =================================================================== --- hssdrc/branches (nonexistent) +++ hssdrc/branches (revision 3)
hssdrc/branches Property changes : Added: svn:mergeinfo ## -0,0 +0,0 ## Index: hssdrc/tags =================================================================== --- hssdrc/tags (nonexistent) +++ hssdrc/tags (revision 3)
hssdrc/tags Property changes : Added: svn:mergeinfo ## -0,0 +0,0 ##

powered by: WebSVN 2.1.0

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