論理的なクイン


8

チャレンジ

独自のソースコードを出力するプログラムを書くだけです。

通常のクインにすぎません。

問題

コンピューターがないので、プログラム可能なロジックデバイス(FPGA、CPLD、ゲートアレイなど)でプログラムを実行する必要があります。

ルール

  • ロジックデバイスに接続されている市販のデバイス(セントロニクスポート経由で接続されたプリンター、LEDディスプレイ、RS232端末など)を使用して、プログラムを出力できます。
  • あらゆる種類のプログラマブルデバイスを出力デバイスとして使用する場合、プログラムロジックをそこに配置することはできません。

    例:RS232を使用してデータをコンピューターに送信する場合、コンピューターはRS232から受信したデータを表示するだけです。ただし、既存の端末プログラムにこの機能がある場合は、データをロジックデバイスにエコーバックするなどのRS232オプションをオンにすることができます。

  • すべての(最近または過去の)「標準」コーディング(ASCII、UNICODE、EBCDIC、モールス符号など)を使用できます。

  • プログラムは、独自のソースコードを出力するだけで済みます。VHDL / Verilog / ...「ワイヤ」と実際のI / Oピンの間のマッピングのみを含むファイル、コンパイラ設定と同様のファイルを含むファイルは「ソースコード」とは見なされないため、書き込む必要はありません。
  • 必要な場合は、選択した周波数のクロック入力ピンが1つあります。
  • オンチップユニット(オンチップSRAMやオンチップ乗算器など)は使用しないでください。
  • コードをテストするために、追加のコードを使用して出力デバイスをシミュレートできます。もちろん、ロジックデバイスもシミュレーションできます(実際のデバイスがない場合)。
  • 標準の抜け穴が適用されます。

勝者

  • プログラムのサイズを計算するために、実際の出力デバイス(プリンタなど)が論理デバイスの一部のI / Oピンに接続されていると想定しています。
  • FPGAで最も少ない「LE」セルを必要とするコード(Altera EP2C20F484C7)が優先されます。
  • 私のFPGAが小さすぎる(=最小のソリューションに十分な大きさではない)場合、「LE」タイプのセル(EP4CGX150DF31I7)を持つ最大のものをコンパイルします。
  • それでも不十分な場合は、無料のコンパイラでサポートされている最大のもの(EP2AGX260FF35I5)を試してみます。
  • そのデバイスがまだ小さすぎる場合は、ソースコードのサイズがカウントされます。

注意

Googleで「quine VHDL」を検索すると、最初のページにVHDLで書かれた少なくとも3つのquinesが見つかりました。

残念ながら、実際のロジックデバイスでは機能せず、エミュレータでのみ機能します(エミュレータの)標準出力が使用されるためです。

幸運を!

回答:


6

エリアに最適化されたVerilog、130 LEゲート

quine自体(実際のファイルはDEC SIXBITでエンコードされています):

module q(s,d);inout s,d;wire[0:1023]v=1024'b0110111100101001011001111110110110010110100100001111011010010111010101110101010110010110111100101001011001111110110100100110100100001111011010100111010101110110111000011100111100111010011001111011100000001001000111011010100111000101100111111010100111010111010100100110101101101110111010011111010110111000011011001101111000011110011100111000000010001100001011111100111001011001001001111001010000001100110010011010011001100010001010100111100101010010011000101001011001111010011011100000001010010111011010010010110100010110111010100111011010100001100100011111100000011010010111110101110110100100010110111001011011101001000000001001011011001100111001010000001010100111011010100010110100010110111001011011101001001011011011111001001101011011001001010000000000000000101101101111100100110101101100100101000000110001001000110011001100100100001001011011101001101110101111110101110100000000110011001100100100011011110111101001110010100101111011010000011010010001010000010010010011111101110110011101010001010000010010010100000111100010;reg[9:0]i=759;reg[2:0]j=7;assign d=j<6?j==2:v[i];always@(posedge s)if(j>5)begin i=i+1;j=j&1^!i?7:1;end else j=j+1;endmodule

コメントとテストベンチ付きの読みやすいバージョン:

module q(s,d);
   // Declare the ports. Making them both "inout" is shortest.
   inout s,d;
   // Data storage for the program.
   wire[0:1023]v=1024'b{DATA GOES HERE};
   // i is the current bit number within the program.
   // This is relative to the /end of the data storage/ (not to the start
   // of the program), so it starts at a nonzero value so that the output
   // starts at the start of the program.
   reg[9:0]i=759;
   // When expanding bits to (6-bit) bytes, j is the bit number within
   // the expansion, from 1 for the first bit up to 6 for the last.
   // When not expanding, j is always 7.
   // DEC SIXBIT encoding for 0 is (from MSB to LSB) 010 000.
   // DEC SIXBIT encoding for 1 is (from MSB to LSB) 010 001.
   // We use SSI encoding for the output, so the MSB is sent first.
   reg[2:0]j=7;
   assign d=j<6?j==2:v[i];
   // When we get a strobe:
   always@(posedge s)
     // If we just output a bit, move onto the next bit.
     // We may also need to reset j.
     if(j>5)
       begin 
          i=i+1;
          j=j&1^!i?7:1;
       end 
     else 
       // If we're inside a bit, continue to output that bit.
       j=j+1;
endmodule
// {TESTBENCH BELOW HERE}

`timescale 10ns / 1ns
module testbench();
   reg clock = 0;
   wire data, strobe;

   always
     #1 clock <= !clock;
   initial
     #14304 $finish;

   assign strobe = clock;
   q testquine(.s(strobe),.d(data));

   always @(negedge strobe)
      $display("%d", data);

endmodule // testbench

Verilogを使用すると、Verityを使用する場合よりも、低レベルの詳細をかなり詳細に制御できます。特に、自分でクロックを制御し、ルールをリセットできます。このプログラムは、ストロボ入力sとデータ出力を備えた同期シリアル接続を対象としていますd。それぞれが1方向でのみ使用されますが、両方を双方向として宣言して数バイトを節約しました。10ビットの論理ゲートを内部で使用できるようにするには、プログラムの非データ部分を1024ビットにまで下げる必要がありました(余分なビットは領域でより高価になるでしょう)。これは重要です。かなりの量のコードを節約するために、私は自分のコードを追加するのではなく、FPGAのハードウェアリセット回路に依存し、ストローブとクロック入力をマージします(これは、それを難し​​くしているため、今日では不快な古いトリックです)クロックツリーを高いクロック速度でバランスを保つためですが、ゴルフには役立ちます。)合成可能であることを願っています。Verilogシンセサイザが双方向ポートをクロックとして使用するのにどれだけうまく対応できるかわかりません。

ソースはDEC SIXBITでエンコードされています(ここでは、1文字のアルファベットを小文字として解釈すると想定しています。Verilogシンセサイザは大文字の解釈を使用する理由はありません)。他のソリューションでは内部的に6ビットの文字セットを使用していたため、バイトを無駄に変換していました。「自然に」6ビット幅の文字セットを使用して、変換が不要になるようにすることをお勧めします。私はので、この特定の6ビットの文字セットを選んだ0し、1彼らの最下位ビットのみが異なる、そして唯一の他のビットがセットされている、12月SIXBIT(つまり、文字列を「エスケープ」)に進数を変換するための回路は非常にあり得ることを意味しますシンプル。興味深いことに、問題の文字セットには改行文字がありません。元のプログラムは、1行ですべてではなく生成を簡単にするが、エンコードを可能にする!Verilogがほとんど空白を気にしないのは良いことです。

ホストにデータを送信するためのプロトコルは、同期シリアルインターフェイスに基づいています。。私はそれがクロックされている(クロック/ストロボトリックを使用できるようにし、オンチップタイミングデバイスに依存しないポータブルプログラムを作成できるようにする)ため、そして非常に単純であるため(つまり、それを実装する多くのコードを無駄にする必要があります)。このプロトコルは、メッセージが終了する場所を指定する方法を指定しません(ホストは知っているはずです)。この特定のケースでは、出力を1024ビットの倍数までゼロビットでパディングしました(合計16パディングビット)。その後(SSIで必要な場合)、メッセージが再起動します。(私はアイドルモードタイマーを実装していません。その目的は、新しいメッセージを送信するか、前のメッセージを繰り返すかを決定することです。このプログラムは常に独自のソースコードをメッセージとして送信するため、区別は表示されません。 。長さ0と見なすことができます。

実際のロジックに関して、最も興味深いのは、変数を分割して、チップ上で必要な面積を減らす方法です。iより大きなレジスタで、プログラムのデータ内の現在の「アドレス」を保持し、それをインクリメントすることによってのみ変更されます。これは、その論理が半加算器構成を使用して合成できることを意味します(名前が示すように、これは、加算器が行うリソースの半分だけを使用します。これは、ほとんどの場合、最小のFPGAでのみ問題になり、大きいFPGAでは3入力または4入力LUTは、半加算器を合成することで大量の無駄な容量が生じるほど強力です。小さい方のレジスタ、jは基本的にステートマシンの状態であり、プログラムの複雑なロジックのほとんどを処理します。それは十分に小さいので、より大きなFPGAのルックアップテーブルを介して完全に処理できます(ロジックは基本的に消えます)。プログラムが小さなFPGA向けに合成される場合は、コードのいくつかの部分が一度に3つのビットすべてを処理するようにエンコードを選択しました。

また、データストレージを循環的に変更したことにも注目してください。i必ずしも最初ではなく、内部の任意の場所を指すことができます。ここに示す配置では、の初期値からi最後まで直接印刷してから、配列全体をエスケープして印刷し、最初からの初期値iまで印刷して、データのすべての部分を印刷できます。の値を保存および復元する必要のない適切な場所i。(このトリックは他の言語のクインにも役立つかもしれません。)

ソースは、長さが1192 6ビットバイトで、894 8ビットバイトに相当します。まったく異なるものに最適化されているにもかかわらず、Verityの送信よりも少ないソースバイトが含まれているのは、ちょっと恥ずかしいことです。これは主に、Verilogには文字列があり、Verityにはないためです。つまり、プログラムを8進数ではなく2進数でエンコードしたとしても(ソースコードサイズの点で効率が大幅に低下します)、プログラムの各バイトをエンコードできます。 8ビットの8ビット文字(各8進数字に4つ)ではなく、6つの6ビット文字(各ビットに1つ)を使用します。プログラムを8進数でエンコードしたVerilogの送信は、ソースコードのサイズはおそらく小さくなりますが、ほぼ確実に面積が大きくなります。

このプログラムでどのくらいの領域が使用されるかわかりません。それは、Verilogシンセサイザのオプティマイザがどれほど強力であるかに大きく依存します(格納されたデータを論理ゲートのセットに変換する最小化の問題は、シンセサイザ自体で行われるものであるため、シンセサイザに作業を投入すると、ソースコード自体になります)はるかに短いため、保存に必要な領域が減少します)。ただし、O(n log n)の複雑さを持つ必要があるため、他のプログラムのO(n²)よりもはるかに小さくなければなりません。OPがFPGAで実行しようとしているのを見てみたいです。(ただし、合成にはかなり時間がかかる場合があります。プログラムをコンパイル時間向けに最適化するために実行できるさまざまな手順がありますが、プログラムが大きくなる=領域が大きくなるため、ここでは取り上げませんでした。)


1
最初のコンパイラー実行では、130のLEゲートのみが使用されていると言われています。LEゲートは2ビットのデータしか格納できず、約750ビットのデータストリームを使用するため、コンパイラがデータを圧縮したか、コンパイル中に問題が発生した可能性があります。明日の朝、コンパイラの結果が正しいかどうかを確認します。
Martin Rosenau 2016年

この構成では、データの多くはゲート自体ではなく、ゲート間の接続パターンで格納されるため、130 LEゲートが正しいと信じることができます。(シンセサイザは基本的に、10ビットのインデックスを1ビットの値にマッピングする式を総当たりです。1024エントリのルックアップテーブルを使用してVerilogプログラムで式を指定しましたが、シンセサイザはより多くのK-map最小化のようなものに基づいた効率的な表現。)

また、コンパイラがコードの一部をブロックRAMまたはブロックROMに最適化していないことも確認する必要があります(質問では許可されていません)。私はそれを要求しませんでしたし、1つを意味するような形式でコードを記述していません(ルックアップテーブルを組み合わせて注意深く作成しました)が、コンパイラの最適化によって奇妙なことが行われる場合があります。それを妨げている最適化がある場合は、最適化をオフにする必要があります。

1
OK。私はピンの問題を管理しました。コードはうまく機能しているようです。未解決の。LEタイプのセルは130個のみです。RAM、ROM等は使用していません。コンパイラーは、データを「圧縮」するためにKVダイアグラムと同様の最適化を行っていると思います。
Martin Rosenau 2016年

1
あなたが勝ちます!おめでとう。
Martin Rosenau

3

ソースコードサイズ(1944バイト)に最適化されたVerity 0.10

私はもともと質問を誤解し、として解釈しました。問題の制限の下では、短いオブジェクトコードよりも短いソースコードでクインを書く方がはるかに簡単であるため、これはおそらく最良の結果でした。これにより、質問が簡単になり、私は合理的に答えを出すことができると感じました。また、入力に高水準の言語を使用するように促されました。つまり、プログラム自体で表現を少なくする必要があります。ハードウェア用のゴルフ言語としてVerityを作成しませんでした(実際にはまったく異なるコンテキストで作成するために実際に採用されました)が、かなり記憶があります(たとえば、典型的なHDLよりもかなり高いレベルで、ボイラープレートがはるかに少なく、一般的なHDLよりも移植性が高い)。

短いオブジェクトコードの正しい解決策は、データをある種のツリー構造に格納することを含むと確信しています。問題がブロックROMの使用を許可していないためです。ある時点で、この原則を使用するプログラムを書き始めた可能性があります(どの言語、おそらくVerity、おそらくVerilog、VHDLには定型句が多すぎて、この種の問題に最適ではない可能性があります)。これは、「手動で作成したROM」のすべてのビットにソースコードのすべてのビットを渡す必要がないことを意味します。ただし、Verityコンパイラーは現在、入力の優先順位と結合性に基づいて出力の構造を合成しています。つまり、命令ポインター(したがってルックアップテーブルへのインデックス)を単項で効果的に表現しています。

プログラム自体:

import <print>new x:=0$1296in(\p.\z.\a.new y:=(-a 5-a 1-a 1-a 2-a 4-a 2-a 3-a 2-a 6-a 2-a 0-a 3-a 0-a 4-a 4-a 7-a 4-a 2-a 6-a 2-a 5-a 1-a 2-a 2-a 0-a 3-a 6-a 7-a 2-a 2-a 1-a 1-a 3-a 3-a 0-a 4-a 4-a 3-a 2-a 7-a 5-a 7-a 0-a 6-a 4-a 4-a 1-a 6-a 2-a 6-a 1-a 7-a 6-a 6-a 5-a 1-a 2-a 2-a 0-a 5-a 0-a 0-a 4-a 2-a 6-a 5-a 0-a 0-a 6-a 3-a 6-a 5-a 0-a 0-a 5-a 0-a 6-a 5-a 2-a 2-a 1-a 1-a 3-a 3-a 0-a 4-a 5-a 3-a 2-a 7-a 5-a 7-a 0-a 5-a 5-a 5-a 1-a 4-a 4-a 3-a 1-a 5-a 5-a 1-a 2-a 2-a 0-a 4-a 3-a 3-a 4-a 1-a 5-a 1-a 0-a 2-a 1-a 1-a 1-a 4-a 4-a 3-a 6-a 7-a 0-a 6-a 0-a 1-a 3-a 2-a 0-a 5-a 4-a 2-a 0-a 5-a 5-a 1-a 2-a 1-a 0-a 4-a 6-a 3-a 4-a 7-a 3-a 6-a 2-a 6-a 0-a 3-a 4-a 1-a 1-a 1-a 2-a 2-a 0-a 4-a 6-a 3-a 3-a 5-a 1-a 7-a 2-a 6-a 1-a 1-a 0-a 2-a 7-a 2-a 1-a 1-a 0-a 4-a 6-a 3-a 1-a 5-a 3-a 7-a 5-a 1-a 2-a 1-a 0-a 4-a 6-a 3-a 5-a 7-a 5-a 7-a 4-a 6-a 5-a 6-a 0-a 3-a 4-a 1-a 1-a 1-a 2-a 2-a 0-a 4-a 3-a 3-a 4-a 1-a 5-a 1-a 0-a 2-a 1-a 1-a 1-a 4-a 5-a 3-a 6-a 7-a 0-a 6-a 0-a 1-a 3-a 2-a 0-a 5-a 4-a 2-a 0-a 4-a 1-a 7-a 7-a 6-a 3-a 7-a 4-a 2-a 0-a 4-a 3-a 6-a 2-a 6-a 3-a 7-a 4-a 2-a 0-a 5-a 4-a 6-a 0-a 7-a 2-a 0-a 1-a 4-a 5-a 3-a 4-a 4-a 4-a 4-a 3-a 6-a 4-a 4-a 4-a 4-a 3-a 6-a 2-a 6-a 1-a 5-a 3-a 7-a 4-a 2-a 0-a 4-a 4-a 6-a 5-a 6-a 3-a 7-a 5-a 3-a 2-a 7-a 5-a 7-a 1-a 4-a 5-a 3-a 6-a 7-a 6-a 7-a 3-a 6-a 1-a 5-a 1-a 1-a 0-a 2-a 7-a 2-a 1-a 1-a 0-a 4-a 7-a 2-a 7-a 1-a 5-a 1-a 4-a 2-a 3-a 7-a 4-a 3-a 2-a 7-a 5-a 7-a 1-a 4-a 4-a 3-a 6-a 7-a 6-a 7-a 6-a 6-a 1-a 5-a 1-a 5-a 4-a 2-a 6-a 2-a 5-a 1-a 2-a 2-a 0-a 3-a 0-a 5-a 1-a 4-a 4-a 3-a 4-a 4-a 4-a 4-a 6-a 6-a 4-a 4-a 4-a 4-a 3-a 6-a 2-a 6-a 1-a 5-a 0-a 5-a 0-a 0-a 0-a 1-a 6-a 5-a 4-a 3-a 2-a 7-a 5-a 7-a 1-a 4-a 4-a 3-a 6-a 7-a 6-a 7-a 3-a 6-a 2-a 0-a 0-a 1-a 4-a 7-a 4-a 7-a 1-a 6-a 2-a 6-a 1-a 7-a 3-a 6-a 3-a 7-a 0-a 6-a 1-a 5-!x)in while!x>0do(p(if z<32then z+92else z);if z==45then while!y>0do(p 97;p 32;p(48^!y$$3$$32);p 45;y:=!y>>3)else skip;x:=!x>>6))print(!x$$6$$32)(\d.x:=!x>>3^d<<1293;0)

より読みやすい:

import <print>
new x := 0$1296 in
(\p.\z.\a.
  new y := (-a 5-a 1-
            # a ton of calls to a() omitted...
            -a 1-a 5-!x) in
  while !x>0 do (
    p(if z<32 then z+92 else z);
    if z==45
    then while !y>0 do (
      p 97;
      p 32;
      p(48^!y$$3$$32);
      p 45;
      y:=!y>>3 )
    else skip;
    x:=!x>>6
  )
)(print)(!x$$6$$32)(\d.x:=!x>>3^d<<1293;0)

基本的な考え方は、データ全体を変数に格納することですx。(通常のクインのように、コードセクションとデータセクションがあります。データはコードのテキストをエンコードし、データのテキストを再生成するために使用することもできます。)残念ながら、Verityでは現在、非常に大きなソースコードで記述される定数(コンパイル中にOCaml整数を使用してソース内の整数を表す。これは、任意の幅の整数型をサポートする言語では明らかに正しくない)–さらに、定数を8進数で指定– x実行時に関数の呼び出しを繰り返しての値を生成しますa。void関数を作成して個別のステートメントとして繰り返し呼び出すこともできますが、その場合、データセクションのテキストの出力を開始する場所を特定するのが難しくなります。そのため、代わりにa整数を返し、算術を使用してデータを格納しました(Verityは算術が左から右に評価されることを保証します)。データセクションはxシングル-サインを使用してエンコードされます。これが実行時に検出されると-a 5-a 1-、を使用してフルに拡張されyます。

yコピーとして初期化することは、xここではかなり微妙です。a具体的にはゼロを返すため、合計のほとんどはゼロからゼロを差し引いたものであり、それ自体をキャンセルします。私たちは、で終わる!x(すなわち「の値x」;ベリティで、OCamlでのように、変数の名前は、何よりも、ポインタのように動作し、そしてあなたは、変数の値で取得するには、明示的にそれを逆参照する必要があります)。単項マイナスに関するVerityの規則は少し複雑です–単項マイナスvは次のように記述されます(-v)–したがって、(-0-0-0-!x)として解析され(-(0-0-0-!x))、に等しくなり!x、最終的にyのコピーとして初期化されますx。(これは、Verityのであることも注目に値しますありません値による呼び出しですが、関数と演算子が評価する順序を選択できます。-は、右の引数の前に左の引数を評価します。特に、左の引数に副作用がある場合、それらは右の引数が評価されるときに表示されます。)

ソースコードの各文字は、2つの8進数を使用して表されます。つまり、ソースコードは64文字に制限されているため、内部で使用するために独自のコードページを作成する必要がありました。出力はASCIIであるため、内部で変換する必要がありました。これが(if z<32 then z+92 else z)目的です。これが、内部表現で使用した文字セットです(番号順(つまり\、コードポイント0、?コードポイント63))。

\]^_`abcdefghijklmnopqrstuvwxyz{ !"#$%&'()*+,-./0123456789:;<=>?

この文字セットは、Verityにとって重要なほとんどの文字を提供します。欠落している注目すべき文字は次のとおりです}(つまり、を使用してブロックを作成することはできません{}が、すべてのステートメントが式であるため、()代わりに使用できます); そして、|(私は排他的ではなく包含的ORの値を作成し使用していた理由ですxが、私はそれがとにかくいかに大を指定するために必要な、私は0に初期化する必要があるという意味します)。私が文字セットに確実に入れたい重要な文字のいくつかは、<>(インポートの場合、シフトも)、()(これらなしで解析できるプログラムを書くのは非常に難しい)、$(ビット幅を扱うすべての場合)、および\(ラムダの場合;理論的には、これを回避することができますlet…in しかし、それははるかに冗長になります)。

プログラムを少し短くするために、ラムダ引数に一時的にバインドすることにより、printとの略語!x$$6$$32(つまり、の下位6ビット!xprintライブラリで使用できるようにキャスト)を作成しました。

最後に、出力の問題があります。Verityは、printデバッグ出力を目的としたライブラリを提供します。シミュレーターでは、プログラムのテストに完全に使用できる標準出力にASCIIコードを出力します。物理回路基板でprintは、特定のチップとそれを囲むボード用に作成されたライブラリに依存します。printVerityディストリビューションには、7セグメントディスプレイに出力を印刷するためにアクセスした評価ボード用のライブラリがあります。ライブラリが最終的に回路基板のスペースを占有することになるので、この問題の最適化されたソリューションとして別の言語を使用して、出力のビットをワイヤに直接出力できるようにする価値があるかもしれません。

ちなみに、このプログラムはハードウェアではO(n²)です。つまり、シミュレーターの方がはるかに悪いです(O(n⁴)だと思います)。 、そして私がプログラムを書いているときに私の変更に時間がどのように反応したかに基づいて、機能は確かに非常に急速に成長するようです。Verityコンパイラは、プログラムを最適化するために436の最適化パス(通常、それをはるかに超える)を必要とし、その後も、私のラップトップではシミュレーションが非常に困難でした。完全なコンパイルとシミュレーションの実行には、次の時間がかかりました。

real  112m6.096s
user  105m25.136s
sys   0m14.080s

ピーク時のメモリは2740232キロバイトです。プログラムの実行には、合計213646クロックサイクルかかります。それでも機能します!

とにかく、私が間違ったことを最適化していたので、この答えは実際には質問を満たしていませんが、他の答えはまだないので、これはデフォルトで最適です(そして、ゴルフのクインがどのように見えるかを見るのはいいですハードウェア言語)。現在、チップ上でより最適化された出力を生成することを目的としたプログラムに取り組むかどうかは、私にはわかりません。(O(n)データエンコーディングは、ここで見られるものよりもかなり複雑になるため、ソースの点ではるかに大きくなる可能性があります。)


一次基準(指定されたFPGAで使用されるLEゲート)のスコアはいくつですか?
Mego 2016年

いいえ、つまり
Mego

@Megoコンパイラveritygos.orgにチェックを依頼しようとしています...
Martin Rosenau、

@Mego:わからない。Verity自体は移植可能な言語ですが、Verityの実装には、指定された特定のチップ用のトップレベルがすでに実装されていない可能性があります。とにかく現時点では、FPGAシンセサイザーを使用できません。私のシミュレーターは6328084駆動信号があると言います。必要なLEゲートの数とほぼ線形の関係にあるはずですが、定数係数が何であるかはわかりません。(一般的に、シミュレーターで客観的にチェックできるものに関して指定された基準があると、ここで物事が簡単になります。)

1
合成でメモリが不足します-これは必ずしも機能しないことを意味するわけではありません。ただし、Verityコンパイラーによって生成された中間VHDLファイルのサイズは> 1MBですが、Verilogソリューションのサイズは2KBしかないので、Verityソリューションが必要とするロジックセルはVerityソリューションよりも少ないと思います。
Martin Rosenau、2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.