配列をソートする(クイックソート)

概要

クイックソートのサンプルです。
アレイサイズ等、可変への対応を特にしていません。
実際に使用する場合はもうすこし作りこむ必要あり。
  • taskのautomaticについて
これがないと、再帰呼び出しが正常にうごきません。
C言語などは、関数は呼ばれるたびにローカル変数を別に生成しますが、verilogは標準だとそうではありません。
実体は1つ、というイメージでしょうか。ハードウェア言語らしいといえばらしいですが・・・
automaticをつけることで、呼ばれるたびに実体を生成するようになる模様。




動作確認

ツール バージョン 結果
ncverilog 06.11-s004 OK
VCS-MX 未確認
ModelSim 未確認

テストコード

28個のデータに乱数を入れたのち、ソートします。

  1. reg [15:0] array [0:27];
  2. integer i;
  3. integer x;
  4.  
  5. initial begin
  6. x=0;
  7. repeat(100)begin
  8. for(i=0;i<=27;i=i+1)begin
  9. array[i] = $random;
  10. end
  11. qsort(0,27);
  12. end
  13. end
  14.  

ソースコード

  1. task automatic qsort;
  2. input integer p_start;
  3. input integer p_end;
  4. reg [15:0] thr_val;
  5. integer thr_p;
  6. integer pi;
  7. integer pj;
  8. integer x;
  9. begin
  10. x=x+1;
  11. if(!(p_start>=p_end || p_start<0 || p_end<0 || p_start>27 || p_end>27))begin
  12. thr_val = array[p_start];
  13. pi = p_start;
  14. pj = p_end;
  15. while(pi<pj)begin
  16. while(array[pj]>=thr_val && pi<pj)begin
  17. pj=pj-1;
  18. end
  19. array[pi]=array[pj];
  20. while(array[pi]<=thr_val && pi<pj)begin
  21. pi=pi+1;
  22. end
  23. array[pj]=array[pi];
  24. end
  25. array[pi]=thr_val;
  26. if(p_start<p_end)begin
  27. qsort(p_start,pi-1 );
  28. qsort(pi+1 ,p_end);
  29. end
  30. end
  31. end
  32. endtask
  33.  















最終更新:2008年11月21日 11:17