SRCS=\
SPI_controler.nsl
+CPP_SRCS=\
+SPI_controler.cpp\
+SPI_controler_test_case.cpp\
+SPI_controler_top.cpp
+LDFLAGS= -L/home/bols/systemc-2.2.0/lib-linux
+LDLIBS= -lcppunit -lsystemc
+CXXFLAGS= -I/home/bols/systemc-2.2.0/include
+INC= -I/home/bols/systemc-2.2.0/include
SC_SRCS=$(patsubst %.nsl,%.sc,$(filter %.nsl,$(SRCS)))
+OBJCS=$(patsubst %.cpp,%.o,$(filter %.cpp,$(CPP_SRCS)))
.SUFFIXES: .o .sc .nsl
-all:create_sc
+all:create_sc runtest
echo $(SC_SRCS)
create_sc:$(SC_SRCS)
+TestMain:$(OBJCS) TestMain.cpp
+
.nsl.sc:
nsl2sc $<
+
+SPI_controler_top.o:
--- /dev/null
+/*
+ Produced by NSL Core(version=20110614), IP ARCH, Inc. Wed Aug 10 21:05:17 2011
+ Licensed to :LIMITED EVALUATION USER:
+*/
+/*
+ EVALUATION COPY! DO NOT USE ANY PART OF THIS FILE FOR COMMERCIAL PRODUCTS.
+*/
+#include <systemc.h>
+template<typename T> int _nsl_readmem(T array[], const char *file, int start, int end, int sft) ;
+
+SC_MODULE( spi_controler ) {
+sc_in<bool> p_reset, m_clock;
+ sc_in <sc_uint<8> > send_data;
+sc_out <sc_uint<8> > resv_data;
+sc_in<bool> send;
+sc_in<bool> read_MOSI;
+sc_in<bool> write_MOSO;
+ sc_signal<sc_uint<8> > output_data;
+ sc_signal<sc_uint<8> > input_data;
+ sc_signal<sc_uint<1> > work_flg;
+
+void _sc_method_output_data() {
+
+}
+void _sc_method_input_data() {
+
+}
+void _sc_method_work_flg() {
+
+}
+ SC_CTOR( spi_controler )
+ :
+ output_data("output_data"),
+ input_data("input_data"),
+ work_flg("work_flg"),
+ send_data("send_data"),
+ resv_data("resv_data"),
+ p_reset("p_reset"),
+ m_clock("m_clock")
+ {
+};
+};
+/*
+ Produced by NSL Core(version=20110614), IP ARCH, Inc. Wed Aug 10 21:05:17 2011
+ Licensed to :LIMITED EVALUATION USER:
+*/
--- /dev/null
+/*
+ Produced by NSL Core(version=20110614), IP ARCH, Inc. Wed Aug 10 21:05:17 2011
+ Licensed to :LIMITED EVALUATION USER:
+*/
+/*
+ EVALUATION COPY! DO NOT USE ANY PART OF THIS FILE FOR COMMERCIAL PRODUCTS.
+*/
+#include <systemc.h>
+template<typename T> int _nsl_readmem(T array[], const char *file, int start, int end, int sft) ;
+
+SC_MODULE( spi_controler ) {
+sc_in<bool> p_reset, m_clock;
+ sc_in <sc_uint<8> > send_data;
+sc_out <sc_uint<8> > resv_data;
+sc_in<bool> send;
+sc_in<bool> read_MOSI;
+sc_in<bool> write_MOSO;
+ sc_signal<sc_uint<8> > output_data;
+ sc_signal<sc_uint<8> > input_data;
+ sc_signal<sc_uint<1> > work_flg;
+
+void _sc_method_output_data() ;
+
+void _sc_method_input_data() ;
+
+void _sc_method_work_flg() ;
+
+ SC_CTOR( spi_controler )
+ :
+ output_data("output_data"),
+ input_data("input_data"),
+ work_flg("work_flg"),
+ send_data("send_data"),
+ resv_data("resv_data"),
+ p_reset("p_reset"),
+ m_clock("m_clock")
+ {
+};
+};
+/*
+ Produced by NSL Core(version=20110614), IP ARCH, Inc. Wed Aug 10 21:05:17 2011
+ Licensed to :LIMITED EVALUATION USER:
+*/
-/*\r
- Produced by NSL Core(version=20101103), IP ARCH, Inc. Wed Aug 10 18:37:57 2011\r
- Licensed to :LIMITED EVALUATION USER:\r
-*/\r
-#include <systemc.h>\r
-#include "spi_controler.sc"\r
-#include <stdlib.h>\r
-sc_clock m_clock("m_clock",10,0.5,0,false);\r
-sc_signal<bool> p_reset;\r
-sc_signal<sc_uinit<8> > send_data;\r
-sc_signal<sc_uinit<8> > resv_data;\r
-sc_signal<sc_uint<1> > send;\r
-sc_signal<sc_uint<1> > read_MOSI;\r
-sc_signal<sc_uint<1> > write_MOSO;\r
-\r
-spi_controler spi_controler("spi_controler");\r
-\r
-static int ctrl_clock=0;\r
-SC_MODULE (c_clock) {\r
- sc_in<bool> m_clock;\r
- void do_reset() {\r
- ctrl_clock++;\r
- if(ctrl_clock==0) p_reset=1;\r
- if(ctrl_clock==1) p_reset=0\r
- }\r
- SC_CTOR(c_clock) {\r
- SC_METHOD(do_reset);\r
- sensitive << m_clock.pos();\r
- }\r
-};\r
-\r
-int sc_main(int argc, char *argv[])\r
-{\r
- int stop;\r
- if(argc>1 && (stop=atoi(argv[1])<=0)) stop=1000;\r
- sc_trace_file *tf = sc_create_vcd_trace_file("spi_controler");\r
- sc_trace(tf,spi_controler.p_reset,"spi_controler.p_reset");\r
- sc_trace(tf,spi_controler.m_clock,"spi_controler.m_clock");\r
- sc_trace(tf,spi_controler.send_data,"spi_controler.send_data");\r
- sc_trace(tf,spi_controler.resv_data,"spi_controler.resv_data");\r
- sc_trace(tf,spi_controler.send,"spi_controler.send");\r
- sc_trace(tf,spi_controler.read_MOSI,"spi_controler.read_MOSI");\r
- sc_trace(tf,spi_controler.write_MOSO,"spi_controler.write_MOSO");\r
- c_clock cclk("cclk");\r
- cclk.m_clock(m_clock);\r
- spi_controler.p_reset(p_reset);\r
- spi_controler.m_clock(m_clock);\r
- spi_controler.send_data(send_data);\r
- spi_controler.resv_data(resv_data);\r
- spi_controler.send(send);\r
- spi_controler.read_MOSI(read_MOSI);\r
- spi_controler.write_MOSO(write_MOSO);\r
- sc_start(stop, SC_NS);\r
- sc_close_vcd_trace_file(tf)\r
-}\r
-/*\r
- Produced by NSL Core(version=20101103), IP ARCH, Inc. Wed Aug 10 18:37:57 2011\r
- Licensed to :LIMITED EVALUATION USER:\r
-*/\r
+/*
+ Produced by NSL Core(version=20110614), IP ARCH, Inc. Wed Aug 10 21:04:09 2011
+ Licensed to :LIMITED EVALUATION USER:
+*/
+/*
+ EVALUATION COPY! DO NOT USE ANY PART OF THIS FILE FOR COMMERCIAL PRODUCTS.
+*/
+#include <systemc.h>
+#include "SPI_controler.sc"
+#include <stdio.h>
+#include <stdlib.h>
+template<typename T> int _nsl_readmem(T array[], const char *file, int start, int end, int sft) ;
+sc_clock m_clock("m_clock",10, SC_NS, 0.5,0, SC_NS, false);
+sc_signal<bool> p_reset;
+sc_signal<sc_uint<8> > send_data;
+sc_signal<sc_uint<8> > resv_data;
+sc_signal<sc_uint<1> > send;
+sc_signal<sc_uint<1> > read_MOSI;
+sc_signal<sc_uint<1> > write_MOSO;
+
+spi_controler spi_controler("spi_controler");
+
+static int ctrl_clock=0;
+SC_MODULE (c_clock) {
+ sc_in<bool> m_clock;
+ void do_reset() {
+ ctrl_clock++;
+ if(ctrl_clock<2) p_reset=1;
+ else p_reset=0;
+ }
+ SC_CTOR(c_clock) {
+ SC_METHOD(do_reset);
+ sensitive << m_clock.pos();
+ }
+};
+
+int sc_main(int argc, char *argv[])
+{
+ int stop;
+ if(argc<2 || (stop=atoi(argv[1]))<=0) stop=1000000;
+ sc_trace_file *tf = sc_create_vcd_trace_file("spi_controler");
+ tf->set_time_unit(1, SC_NS);
+ sc_trace(tf,spi_controler.send_data,"spi_controler.send_data");
+ sc_trace(tf,spi_controler.resv_data,"spi_controler.resv_data");
+ sc_trace(tf,spi_controler.send,"spi_controler.send");
+ sc_trace(tf,spi_controler.read_MOSI,"spi_controler.read_MOSI");
+ sc_trace(tf,spi_controler.write_MOSO,"spi_controler.write_MOSO");
+ sc_trace(tf,spi_controler.p_reset,"spi_controler.p_reset");
+ sc_trace(tf,spi_controler.m_clock,"spi_controler.m_clock");
+ sc_trace(tf,spi_controler.output_data,"spi_controler.output_data");
+ sc_trace(tf,spi_controler.input_data,"spi_controler.input_data");
+ sc_trace(tf,spi_controler.work_flg,"spi_controler.work_flg");
+ c_clock cclk("cclk");
+ cclk.m_clock(m_clock);
+ spi_controler.p_reset(p_reset);
+ spi_controler.m_clock(m_clock);
+ spi_controler.send_data(send_data);
+ spi_controler.resv_data(resv_data);
+ spi_controler.send(send);
+ spi_controler.read_MOSI(read_MOSI);
+ spi_controler.write_MOSO(write_MOSO);
+ sc_start(stop, SC_NS);
+ sc_close_vcd_trace_file(tf);
+}
+
+template<typename T> int _nsl_readmem(T array[], const char *file, int start, int end, int sft) {
+ FILE *txt;
+ uint64_t addr,data;
+ int i,bit,c,lastch,incomm;
+ if((txt=fopen(file,"r"))==NULL) {
+ return(1);
+ }
+ addr = start;
+ data = 0;
+ lastch=0;
+ incomm=0;
+ while((c=fgetc(txt))!=EOF) {
+ unsigned int ch;
+ if(incomm) {
+ if(c=='\n') incomm=0;
+ continue;
+ }
+ if(c=='#') {incomm++; continue;}
+ if(c=='_' || c=='\r' ) continue;
+ if(!lastch && (c==' ' || c=='\t' || c=='\n') ) continue;
+ lastch=c;
+ ch = c - 97;
+ if(sft==4 && ch<6) {
+ data=(data << sft);
+ data = (data + ch + 10);
+ }
+ else if(sft==4 && ch+32 < 6) {
+ data=(data << sft);
+ data = (data + ch + 32 + 10);
+ }
+ else if(sft==4 && ch+49 < 10) {
+ data=(data << sft);
+ data = (data + ch + 49);
+ }
+ else if(sft==1 && ch+49 < 2) {
+ data=(data << sft);
+ data = (data + ch + 49);
+ }
+ else {
+ array[addr] = data;
+ addr++;
+ if(addr>=end) break;
+ lastch=0;
+ data=0;
+ continue;
+ }
+ }
+ fclose(txt);
+ return 0;
+}
+void _nsl_hook(char *file, int line, int attrib, const char *name) {}
--- /dev/null
+#include <cppunit/extensions/HelperMacros.h> //
+#include "SPI_controler_top.h"
+
+// 以下はSPIControlerTestクラスの宣言-----
+class SPIControlerTest : public CPPUNIT_NS::TestFixture { //
+ CPPUNIT_TEST_SUITE( SPIControlerTest ); //
+ CPPUNIT_TEST( test_init ); //
+ CPPUNIT_TEST( test_incr ); //
+ CPPUNIT_TEST( test_clear ); //
+ CPPUNIT_TEST_SUITE_END(); //
+
+protected:
+ SPIControlerTop* c_;
+
+public:
+ void setUp(); //
+ void tearDown(); //
+
+protected:
+ void test_init(); //
+ void test_incr(); //
+ void test_clear(); //
+};
+
+// 以下はSPIControlerTestクラスの実装-----
+
+CPPUNIT_TEST_SUITE_REGISTRATION( SPIControlerTest ); //
+
+// 各テスト・ケースの実行直前に呼ばれる
+void SPIControlerTest::setUp() {
+ c_ = new SPIControlerTop();
+}
+
+// 各テスト・ケースの実行直後に呼ばれる
+void SPIControlerTest::tearDown() {
+ delete c_;
+}
+
+// これ以降はテスト・ケースの実装内容
+
+void SPIControlerTest::test_init() {
+ CPPUNIT_ASSERT_EQUAL(0,(int) c_->read_MOSI()); //
+}
+
+void SPIControlerTest::test_incr() {
+ for ( int i = 1; i < 10; ++i ) {
+ CPPUNIT_ASSERT_EQUAL(i,(int) c_->read_MOSI()); //
+ }
+}
+
+void SPIControlerTest::test_clear() {
+ CPPUNIT_ASSERT_EQUAL(0,(int) c_->read_MOSI()); //
+}
--- /dev/null
+/*\r
+ Produced by NSL Core(version=20110614), IP ARCH, Inc. Wed Aug 10 21:04:09 2011\r
+ Licensed to :LIMITED EVALUATION USER:\r
+*/\r
+/*\r
+ EVALUATION COPY! DO NOT USE ANY PART OF THIS FILE FOR COMMERCIAL PRODUCTS. \r
+*/\r
+#include "SPI_controler.h"\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <stdint.h>\r
+template<typename T> int _nsl_readmem(T array[], const char *file, int start, int end, int sft) ;\r
+sc_clock m_clock("m_clock",10, SC_NS, 0.5,0, SC_NS, false);\r
+sc_signal<bool> p_reset;\r
+sc_signal<sc_uint<8> > send_data;\r
+sc_signal<sc_uint<8> > resv_data;\r
+\r
+spi_controler spi_controler("spi_controler");\r
+\r
+static int ctrl_clock=0;\r
+SC_MODULE (c_clock) {\r
+ sc_in<bool> m_clock;\r
+ void do_reset() {\r
+ ctrl_clock++;\r
+ if(ctrl_clock<2) p_reset=1;\r
+ else p_reset=0;\r
+ }\r
+ SC_CTOR(c_clock) {\r
+ SC_METHOD(do_reset);\r
+ sensitive << m_clock.pos();\r
+ }\r
+};\r
+\r
+template<typename T> int _nsl_readmem(T array[], const char *file, int start, int end, int sft) {\r
+ FILE *txt;\r
+ uint64_t addr,data;\r
+ int i,bit,c,lastch,incomm;\r
+ if((txt=fopen(file,"r"))==NULL) {\r
+ return(1);\r
+ }\r
+ addr = start;\r
+ data = 0;\r
+ lastch=0;\r
+ incomm=0;\r
+ while((c=fgetc(txt))!=EOF) {\r
+ unsigned int ch;\r
+ if(incomm) {\r
+ if(c=='\n') incomm=0;\r
+ continue;\r
+ }\r
+ if(c=='#') {incomm++; continue;}\r
+ if(c=='_' || c=='\r' ) continue;\r
+ if(!lastch && (c==' ' || c=='\t' || c=='\n') ) continue;\r
+ lastch=c;\r
+ ch = c - 97;\r
+ if(sft==4 && ch<6) {\r
+ data=(data << sft);\r
+ data = (data + ch + 10);\r
+ }\r
+ else if(sft==4 && ch+32 < 6) {\r
+ data=(data << sft);\r
+ data = (data + ch + 32 + 10);\r
+ }\r
+ else if(sft==4 && ch+49 < 10) {\r
+ data=(data << sft);\r
+ data = (data + ch + 49);\r
+ }\r
+ else if(sft==1 && ch+49 < 2) {\r
+ data=(data << sft);\r
+ data = (data + ch + 49);\r
+ }\r
+ else {\r
+ array[addr] = data;\r
+ addr++;\r
+ if(addr>=end) break;\r
+ lastch=0;\r
+ data=0;\r
+ continue;\r
+ }\r
+ }\r
+ fclose(txt);\r
+ return 0;\r
+}\r
+void _nsl_hook(char *file, int line, int attrib, const char *name) {}\r
+\r
+#include "SPI_controler_top.h"\r
+SPIControlerTop::SPIControlerTop()\r
+{\r
+sc_signal<bool> send;\r
+sc_signal<bool> read_MOSI;\r
+sc_signal<bool> write_MOSO;\r
+ int stop;\r
+ tf = sc_create_vcd_trace_file("spi_controler");\r
+ tf->set_time_unit(1, SC_NS);\r
+ sc_trace(tf,spi_controler.send_data,"spi_controler.send_data");\r
+ sc_trace(tf,spi_controler.resv_data,"spi_controler.resv_data");\r
+ sc_trace(tf,spi_controler.send,"spi_controler.send");\r
+ sc_trace(tf,spi_controler.read_MOSI,"spi_controler.read_MOSI");\r
+ sc_trace(tf,spi_controler.write_MOSO,"spi_controler.write_MOSO");\r
+ sc_trace(tf,spi_controler.p_reset,"spi_controler.p_reset");\r
+ sc_trace(tf,spi_controler.m_clock,"spi_controler.m_clock");\r
+ sc_trace(tf,spi_controler.output_data,"spi_controler.output_data");\r
+ sc_trace(tf,spi_controler.input_data,"spi_controler.input_data");\r
+ sc_trace(tf,spi_controler.work_flg,"spi_controler.work_flg");\r
+ c_clock cclk("cclk");\r
+ cclk.m_clock(m_clock);\r
+ spi_controler.p_reset(p_reset);\r
+ spi_controler.m_clock(m_clock);\r
+ spi_controler.send_data(send_data);\r
+ spi_controler.resv_data(resv_data);\r
+ spi_controler.send(send);\r
+ spi_controler.read_MOSI(read_MOSI);\r
+ spi_controler.write_MOSO(write_MOSO);\r
+}\r
+\r
+SPIControlerTop::~SPIControlerTop()\r
+{\r
+ sc_close_vcd_trace_file(tf);\r
+}\r
+\r
+void SPIControlerTop::nextStep()\r
+{\r
+}\r
+\r
+void SPIControlerTop::send()\r
+{\r
+}\r
+\r
+char SPIControlerTop::read_MOSI()\r
+{\r
+ return 0;\r
+}\r
+\r
+void SPIControlerTop::write_MOSO(char send_data)\r
+{\r
+}\r
+\r
--- /dev/null
+#ifndef __SPI_CONTROLER_TOP_H__
+#define __SPI_CONTROLER_TOP_H__
+#include <systemc.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+class SPIControlerTop {
+public :
+ sc_trace_file *tf;
+ SPIControlerTop();
+ ~SPIControlerTop();
+ void nextStep();
+ void send();
+ char read_MOSI();
+ void write_MOSO(char send_data);
+
+};
+#endif /* __SPI_CONTROLER_TOP_H__ */
--- /dev/null
+#include <cppunit/BriefTestProgressListener.h>
+#include <cppunit/CompilerOutputter.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+#include <cppunit/TestResult.h>
+#include <cppunit/TestResultCollector.h>
+#include <cppunit/TestRunner.h>
+#include <systemc.h>
+int sc_main( int argc, char* argv[] ) {
+ // イベント・マネージャとテスト・コントローラを生成する
+ CPPUNIT_NS::TestResult controller;
+
+ // テスト結果収集リスナをコントローラにアタッチする
+ CPPUNIT_NS::TestResultCollector result;
+ controller.addListener( &result );
+
+ // 「.」で進行状況を出力するリスナをアタッチする
+ CPPUNIT_NS::BriefTestProgressListener progress;
+ controller.addListener( &progress );
+
+ // テスト・ランナーにテスト群を与え、テストする
+ CPPUNIT_NS::TestRunner runner;
+ runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() );
+ runner.run( controller );
+
+ // テスト結果を標準出力に吐き出す
+ CPPUNIT_NS::CompilerOutputter outputter( &result, CPPUNIT_NS::stdCOut() );
+ outputter.write();
+
+ return result.wasSuccessful() ? 0 : 1;
+}