O

`ifndef ROUTER_INTERFACE_SV

`define ROUTER_INTERFACE_SV

interface  router_interface(input  logic  [0:0] clock);

   logic        reset_n;

   logic [15:0] din; 

   logic [15:0] frame_n; 

   logic [15:0] valid_n;

   logic [15:0] dout; 

   logic [15:0] valido_n;

   logic [15:0] busy_n; 

   logic [15:0] frameo_n;

   clocking cb @(posedge clock);

       output  din; 

       output  frame_n; 

       output  valid_n;

       output  reset_n;

       input dout; 

       input valido_n;

       input busy_n; 

       input frameo_n;

   endclocking  : cb

   modport  TB(clocking cb,  output reset_n);

endinterface  : router_interface

`endif  //ROUTER_INTERFACE_SV

* * *

[图片上传失败...(image-e19758-1658799902766)]

## 

例化变量要在显示之前【否则会报错】

* * *

`ifndef ROUTER_SEND_RECEIVE_CHECK_SV

`define ROUTER_SEND_RECEIVE_CHECK_SV

program  router_send_receive_check(router_interface router_inf_tb);

  task  send_addr(input  bit  [3:0] source_addr_i,input  bit[3:0] dest_addr_i);

   $display("send_addr,source_addr_i=0x%0h",source_addr_i,dest_addr_i);/*{{{*/

   for(int i=0; i<4  ; i++) begin

      @(router_inf_tb.cb);

      router_inf_tb.cb.din[source_addr_i]  <= dest_addr_i[i];

      router_inf_tb.cb.frame_n[source_addr_i]  <=  1'b0;

      router_inf_tb.cb.valid_n[source_addr_i]  <=  1'b0;

   end/*}}}*/

  endtask: send_addr

  task  send_pad(input  bit[3:0] source_addr_i);

   $display("send_pad, source_addr_i=0x%0h",source_addr_i);

   for(

     int i=0; i <  5; i++)  begin/*{{{*/

      @(router_inf_tb.cb);

      router_inf_tb.cb.din[source_addr_i]  <=  1;

      router_inf_tb.cb.frame_n[source_addr_i]  <=  1'b0;

      router_inf_tb.cb.valid_n[source_addr_i]  <=  1'b1;

   end/*}}}*/

  endtask: send_pad

  task  send_data(input  bit  [3:0] source_addr_i,  input  bit  [7:0] data_q_i[$])  ;

   $display("send_data,source_addr_i=0x%0h,data:%p",source_addr_i,data_q_i);

   foreach  (data_q_i[index])  begin   // byte :8bit

     for(int i =  0; i <  8; i++)  begin/*{{{*/

        @(router_inf_tb.cb);

        router_inf_tb.cb.din[source_addr_i]  <= data_q_i[index][i];

        router_inf_tb.cb.valid_n[source_addr_i]  <=  1'b0;

       if((index ==  (data_q_i.size()-1))  &&  (i ==  7))  begin   // last beat

          router_inf_tb.cb.frame_n[source_addr_i]  <=  1'b1;

       end  else  begin

          router_inf_tb.cb.frame_n[source_addr_i]  <=  1'b0;

       end/*}}}*/

     end

   end

    @(router_inf_tb.cb);

    router_inf_tb.cb.valid_n[source_addr_i]  <=  1'b1;

  endtask  : send_data

  task  send_data_8bit(input  bit  [3:0] source_addr_i,  input  bit  [7:0] data_i);

   $display("send_data, source_addr_i=0x%0h, data=0x%h", source_addr_i, data_i);

     for(int i =  0; i<8; i++)  begin

        @(router_inf_tb.cb);

        router_inf_tb.cb.din[source_addr_i]  <= data_i[i];

        router_inf_tb.cb.valid_n[source_addr_i]  <=  1'b0;

       if(i ==  7)  begin

          router_inf_tb.cb.frame_n[source_addr_i]  <=  1'b1;

       end  else  begin

          router_inf_tb.cb.frame_n[source_addr_i]  <=  1'b0;

       end

       end

  endtask: send_data_8bit

  task  gen_data(input  int send_data_num_i,output  bit[7:0] data_q_o[$]); // gen data

   bit[7:0] data;

   $display("gen_data,send_data_num=%0d",send_data_num_i);

   for(int i =  0; i< send_data_num_i ; i++)  begin

data =  $random(); //  $ urandom_range(100,200) 

      data_q_o.push_back(data);

   end

  endtask: gen_data

  task send (input  bit[3:0]source_addr_i,  input  bit[3:0] dest_addr_i,  input  int send_data_num_i,output  bit  [7:0] data_q_o[$]);

   // send addr

   send_addr(.source_addr_i(source_addr_i),  .dest_addr_i(dest_addr_i));

     // send pad

   send_pad(.source_addr_i(source_addr_i));

     // gen data

   gen_data(.send_data_num_i(send_data_num_i),  .data_q_o(data_q_o)); 

     // send data

   send_data(.source_addr_i(source_addr_i),.data_q_i(data_q_o)); 

  endtask:send

  task  reset();

   $display("interface_reset_test,reset enter....");

    router_inf_tb.reset_n <=  1'b0;

    router_inf_tb.cb.din <=  'h0;

    router_inf_tb.cb.frame_n <=  'h1;

    router_inf_tb.cb.valid_n <=  'h1;

   ##2 router_inf_tb.cb.reset_n <=  1'b1;

   repeat(15)  begin

      @(router_inf_tb.cb);

   end

  endtask  : reset

  task  receive(input  bit[3:0] dest_addr_i,  output  bit  [7:0] data_q_o[$]);

   bit  [7:0] data;

   bit  [2:0] i =  0;

   $display("receive,enter.....");

   forever  begin

         if(i==0)  begin

            data_q_o.push_back(data);

           $display("receive,data_q_o:%p",data_q_o); // %

      @(router_inf_tb.cb);

     if(router_inf_tb.cb.valido_n[dest_addr_i]  ==0)  begin

         if(router_inf_tb.cb.frameo_n[dest_addr_i]  ==0)  begin

            data[i]  = router_inf_tb.dout;

i = i +  1;

         end  else  if  (router_inf_tb.frameo_n[dest_addr_i]  ==  1  &&  (i ==  7))  begin

            data[i]  = router_inf_tb.dout;

i = i +  1;

         end  else  begin

           $display("error dut output frameo_n, i=%0d",i);

           $finish;

         end

         if(i==0)  begin

            data_q_o.push_back(data);

           $display("receive,data_q_o:%p",data_q_o); // %p print queue

         end 

     end

   end

  end

  endtask:receive

  task  check(input  bit[7:0] send_data_q_i[$],  input  bit  [7:0] receive_data_q_i[$]);

   bit  [7:0] actual_data;   /// send_data _q = 0x

   bit  [7:0] expect_data;

   // send data size ?= receive data size

   if(send_data_q_i.size()!= receive_data_q_i.size())  begin

     $display("data check error,send_data_q_i.size:%0d != receive_data_q_i.size: %0d",send_data_q_i.size(),receive_data_q_i.size())  ;

   end

   //

   //

   foreach(receive_data_q_i[i])  begin

actual_data = receive_data_q_i.pop_front();

expect_data = send_data_q_i.pop_front();

     if  (actual_data != expect_data)  begin

       $display("data check error, expect_data = 0x%0h, actual_data = 0x%0h",expect_data,actual_data);

     end  else  begin

       $display("data check right, expect_data = 0x%0h, actual_data = 0x%0h",expect_data,actual_data);

     end

   end 

  endtask:check

  initial  begin

     bit[3:0] source_addr =  0;

     bit[3:0] dest_addr =  3;

     int send_data_num =  2;

     bit  [7:0] send_data_q[$];

     bit  [7:0] receive_data_q[$];

   // reset

   reset();

     // send

   fork

     send(.source_addr_i(source_addr),.dest_addr_i(dest_addr),  .send_data_num_i(send_data_num),.data_q_o(send_data_q));

     //receive

     receive(.dest_addr_i(dest_addr),.data_q_o(receive_data_q)); // forever

   join_any

     //check

   check(.send_data_q_i(send_data_q),.receive_data_q_i(receive_data_q));

  end

endprogram: router_send_receive_check

`endif  //ROUTER_SEND_RECEIVE_CHECK_SV

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容