Hikvision 2024 デジタル ロジック設計インターンシップ筆記試験分析



説明する

5 月 11 日の夜に Hikvision の筆記試験を録画します。それを必要とする IC 関係者と共有してください。

役職: デジタル ロジック設計エンジニア (杭州、浙江省)

転載には私の同意が必要です!

私の意見は必ずしも正確ではありません。コメントエリアでの交換や修正を歓迎します~~


複数の選択肢

1. (3 点) Verilog で、分岐ステートメントではないステートメントは次のうちどれですか?

ケース

B、if-else

C、ケース

D、リピート

一見すると、D

2. (3 点) reg[0:31] の場合、式 hik[0:+8] は何を指しますか?

IEEE の Verilog 標準では、これを原文で次のように表現しています。

 例:

シミュレーションを見てみましょう:

// ========================================================================
// 功能描述:-1- 验证Verilog 语法部分位选择
// 作者:Xu Y. B.
// 时间:2023-05-12
// ========================================================================

`timescale 1ns / 1ps

module TB_PART_SEL_BIT();
// 小端数据
wire [0:31] W_DATA = {8'd1,8'd2,8'd3,8'd4};

wire [7:0] W_1 = W_DATA[0+:8]; //W_DATA[0:7]
wire [7:0] W_2 = W_DATA[31-:8];//W_DATA[24:31]
wire [8:0] W_3 = W_DATA[0:+8]; //W_DATA[0:8]
wire [8:0] W_4 = W_DATA[+1:+8]; //W_DATA[1:8]

// 大端数据
wire [31:0] W_DATA_2 = {8'd1,8'd2,8'd3,8'd4};

wire [7:0] W_5 = W_DATA_2[31-:8]; //W_DATA[31:24]
wire [7:0] W_6 = W_DATA_2[0+:8];  //W_DATA[7:0]
wire [7:0] W_7 = W_DATA_2[+8:+8]; //W_DATA[8]
wire [7:0] W_8 = W_DATA_2[+8:0];  //W_DATA[8:0]

// 索引号为非正
wire [0:-31] W_DATA_3 = {8'd1,8'd2,8'd3,8'd4};
wire [7:0] W_9  = W_DATA_3[0-:8];    //W_DATA[0:-7]
wire [7:0] W_10 = W_DATA_3[-31+:8];  //W_DATA[-24:-31]
wire [7:0] W_11 = W_DATA_3[-8:-8];   //W_DATA[-8]


// 简单总结:
// -1- 数字前面的 + - 符号表示正负,与其后的数字组成 位的索引号;
// -2- 数字后面的 + - 符号表示位选择的方向,±符号前的数字表示起始比特,:后面的数字表示位宽

endmodule

シミュレーション結果を見てください。

3. (3 点) a=4'b0101 の場合、式 ^a= ?

Verilog リダクション演算を理解している人なら誰でも、結果が 1'b0 になるはずであることを知っています。これ以上

4. (3 点) ネットリスト (ネットリスト) とその RTL の整合性を検証するには、一般的にどのような方法が使用されますか?

A. RTL 検証

B. ネットリストの検証

C. 正式な検証

D. ランダム検証

形式的検証は、RTL コードと合成されたゲート レベルのネットリストの間の論理的等価性を検証することです。機能的等価性はタイミングとは何の関係もありません。

この質問では C を選択します

5. (3 点) 回路設計プロセスにおいて、性能要件は弱いがタイミング収束が難しい乗算器は、計算を完了するのに最大 5 クロック サイクルを必要とすることが知られており、タイミングを最適化するために multicyc を設定することを考慮すると、以下の制約が発生します。どのように設定すればよいでしょうか。
set multicycle path ()-setup-from start point-to end point
set multicycle_path ()-hold-from start point-to end point

あ、4、4

B、5、4

C、5、5

D、5、1

マルチサイクル制約の場合、セットアップ時間制約は 5 クロック サイクル、ホールド時間制約は 1 クロック サイクルの時間オフセットにより 4 クロック サイクルである必要があります。したがって、この質問では B を選択します

答えは、書籍『ナノメートル設計のための静的タイミング解析 実践的アプローチ』にも記載されています。

6. (3 点) モジュールがタスク 1 を完了すると仮定すると、A、B、C の 3 つのステップを順番に実行する必要があり、タスク 2 を完了するには、A、B、C、および順にD。A、B、C、D の 4 つのステップには、それぞれ 2clk、3clk、4clk、5clk かかります。タスク 1 をタスク 2 より前に開始する必要がある場合、モジュールはタスク 1 とタスク 2 を完了するために最も短い () clk を必要とします。

14クロック必要だと思います。

2 つのステップは重複しているため、タスク 1 のステップ A、B、または C が終了した後、タスク 2 はタスク 2 の後に他のステップを開始できるため、合計 2+3+4+5 = 14 clk が必要になります。

7. (3 点) チップの動作中に電源オフと電源オンが複数回発生しますが、最後のパワーオン リセット後のオンチップ SRAM の内部記憶領域の値はいくらですか?

この質問はランダムな値だと思いますが、SRAMは電源を切ると揮発しやすいという特性があります。電源投入後のデータはランダムな値です。

8. (3 点) 10 進数 +127、-127 の 8-bt 符号付き 2 の補数表現は ?

これは基本的な常識であり、+127 の 2 の補数: 8'b01111111、-127 の 2 の補数: 8'10000001

9. (3 点) 以下のサブグレードの 1 つだけを使用して、論理 (A XOR B) OR (C AND D) を実現できます ()

A、NAND
B、XOR
C、NOR
D、AND

 上記の導出結果によれば、論理はNANDゲートのみで実現できる。だからNANDだと思う

10. (3 点) シェル スクリプトで、変数の値をターミナルに出力するために使用できるキーワードは何ですか?

エコー

複数の選択肢

1. 検証終了の前提条件の説明は正しいですか?

A. 欠陥曲線は収束します

B. 検証報告書の完成レビュー

C. カバー率が 100% に達する

D. 複数ラウンドのランダムテストが完了した

100% のカバレッジは要件ではありません。

私が考える選択肢は ABD です

2. (5 点) メモリ階層に関して、通常正しいのは次のどれですか
A. 読み取り操作で返される値は、キャッシュ内にどのブロックがあるかによって異なります
B. キャッシュは時間的局所性を利用します
C. メモリ階層 コストの大部分は最上位の階層
D にあり、ストレージ階層の容量の大部分は最下位の階層にあります

キャッシュは時間的局所性と空間的局所性を利用します。

キャッシュは同じサイズのブロック (キャッシュ ブロック) に分割されており、CPU がメモリからデータを読み書きする必要がある場合、メイン メモリのアドレスをキャッシュに送信して、対応するブロックがあるかどうかを確認します。キャッシュ内のブロックをメモリから検索して置換する必要があるため、再度読み取ると削除が発生します。

 

この質問は任意です。

3. (5 点) 以下の AMBA バスはバースト送信をサポートします ()

A、APB

B、AXI

C、AXI-Lite

D、AHB

APB は高度なペリフェラル バスであり、バースト転送をサポートしません。

高度な拡張インターフェイスである AXI は、バースト転送をサポートします。

軽量の AXI プロトコルである AXI-Lite は、バースト転送をサポートしていません。

AXI-Stream は、無制限のバースト送信をサポートします。

AHB は主に高性能モジュール (CPU、DMA、DSP など) 間の接続に使用され、SoC のオンチップ システム バスとして次の機能を備えています: シングル クロック エッジ動作、非トライクロック エッジ動作。状態実装、バースト送信をサポート、セグメント送信をサポート、複数のマスター コントローラをサポート、32 ビットから 128 ビットのバス幅に設定可能、バイト、ハーフワード、ワード送信をサポート。

したがって、この質問が選ばれたと思います: BD

4. (5 点) 以下の図の 4 つのパスはタイミング パスに属します。

この質問の 4 つのパスはすべて連続したパスです。 

 静的タイミング解析のバイブル: 『ナノメートル設計のための静的タイミング解析 実践的なアプローチ』という本では、次のように説明されています。

5. Verilog では、次の変数名が有効です。

あ、233

B、定義する

C、用

D、ハイクビジョン

この質問が選択されました、BD さん、きっと B について疑問があると思います。自分でコードを書いて見てください。次のようなものを見ることができます。

含む

タイムスケール

信号名として使用されているキーワードに構文エラーがあるかどうか。

6. 次のコードのうち、設計上の期待と一致しないもの、または機能上の問題があるものはどれですか?

A、assign a = din ^ n;//求指数
B、parameter WIDTH;
   assign WIDTH = 8;
C、reg [7:0] dat;
always @ (*) dat = 'd100;
D、assign a = b&c;
assign b = (~a) & d;

Verilog 演算子の ^ は、2 つの演算間のビット単位の XOR 演算を意味します。

パラメータ型パラメータには、定義時にデフォルト値を与える必要があります。

選択肢Dの記述に問題があると思います。 

C オプションは常に定数のままにすることができます。

なのでABDを選ぶと思います

7. (5 点) 次のステートメントは正しいです:
A. 信号の有効範囲は、信号が使用する必要がある範囲以上である必要があります
B. 信号のセマンティクスが変更されない場合、その有効範囲は次のようになります。 C.シグナル 有効
期間の種類は、現時点で有効、一定期間内有効、常時有効に分けられ、fifo のエンプティ信号は常時有効となります。 D. シグナルの有効間隔は、
シグナルがその名前にふさわしい間隔以下である必要があります。

FIFO の空信号は、主に非同期 FIFO の CDC 問題により、常に有効であるとは限りません。

C 以外は再度選択できると思います。

8. (5 点) 検証のレベルはどの程度ですか?
A. チップレベル (chiplevel)
B. IP 統合レベル (IPIntergration level)
C. モジュールユニットレベル (blocklevel/unitlevel)
D. サブシステムレベル (subsystem level)

この質問は明らかです。すべて選択してください

質問と回答

(15 点) CPU は特定の命令セット アーキテクチャに基づいて設計されています。たとえば、x86 命令セットに基づくインテル プロセッサは典型的な CISC ですが、risc-V 命令セットに基づくオープンソースのロケット プロセッサは典型的な RISC です。 。では、コンピューター システムに命令セット アーキテクチャを導入する利点は何でしょうか?

命令セット アーキテクチャの導入には次の利点があります。
1. ハードウェア設計の簡素化: 命令セット アーキテクチャは標準命令セットのセットを定義するため、CPU のハードウェア設計はこれらの命令セットに従って完了でき、複雑さが軽減されます。そしてハードウェア設計の難しさ。
2. コードの移植性の向上: 異なる CPU が同じ命令セット アーキテクチャに従うため、作成されたプログラムは異なる CPU 上で実行でき、プログラムの移植性が向上します。
3. コンパイラと最適化プログラムの開発効率の向上: 命令セット アーキテクチャは、いくつかの標準的な命令形式とコーディング ルールを提供できるため、コンパイラと最適化プログラムの開発がより便利で効率的になります。
4. ソフトウェア開発コストの削減: 異なる CPU が同じ命令セット アーキテクチャに従っているため、ソフトウェア開発者は異なる CPU で実行するコードを 1 つ作成するだけで済み、ソフトウェア開発のコストと難易度が軽減されます。
5. システム パフォーマンスの向上: 命令セット アーキテクチャを特定のアプリケーション シナリオに合わせて最適化できるため、システム パフォーマンスが向上します。


つまり、命令セット アーキテクチャの導入により、ハードウェア設計の簡素化、ソフトウェアの移植性、コンパイラと最適化プログラムの開発効率が向上し、ソフトウェア開発コストが削減され、特定のアプリケーション シナリオに合わせて最適化できるため、システムのパフォーマンス。

(15 点) [N 8bit 加算] NUM INPUT と int8 入力を持つ加算モジュールを作成してください。NUM INPUT の値は 2、4、8、16 です。 モジュール インターフェイスは次のように定義されます。 module
#
(
パラメータNUM_INPUT=8

) add_n8bit(

入力 [NUM_INPUT*8-1:0] 入力、
出力 [12-1:0] 出力
);

この疑問を実現するために加算木の構造を使用します。入力データは最大 16 個ありますので、最も多く入力されるデータに合わせてプログラムしてください。

設計コード:

// n个8位宽数据相加模块。n可取值 2 4 8 16
// Xu Y. B.
// 2023 05 13

module add_n8bit #(
parameter NUM_INPUT = 8
)(
input 	[NUM_INPUT*8-1:0]	in,
output	[12-1:0]			out
);
wire [16*8-1:0] W_ALL_IN = {
    
    {((16-NUM_INPUT)*8){1'b0}},in};

wire [8:0] W_ADD_L1[7:0];
wire [9:0] W_ADD_L2[3:0];
wire [10:0] W_ADD_L3[1:0];
// wire [11:0] W_ADD_L4;

genvar GV_1;
generate 
	for(GV_1 = 0;GV_1 < 8;GV_1 = GV_1 + 1)
	begin
		//扩展符号位并相加
		assign W_ADD_L1[GV_1] = {W_ALL_IN[GV_1*8+8-1],W_ALL_IN[GV_1*8+:8]} + {W_ALL_IN[(GV_1+8)*8+8-1],W_ALL_IN[(GV_1+8)*8+:8]};
	end
endgenerate

genvar GV_2;
generate
	for(GV_2 = 0;GV_2 < 4;GV_2 = GV_2 + 1)
	begin
		assign W_ADD_L2[GV_2] = {W_ADD_L1[GV_2][8],W_ADD_L1[GV_2]} + {W_ADD_L1[GV_2+4][8],W_ADD_L1[GV_2+4]};
	end
endgenerate

genvar GV_3;
generate
	for(GV_3 = 0;GV_3 < 2;GV_3 = GV_3 + 1)
	begin
		assign W_ADD_L3[GV_3] = {W_ADD_L2[GV_3][9],W_ADD_L2[GV_3]} + {W_ADD_L2[GV_3+2][9],W_ADD_L2[GV_3+2]};
	end
endgenerate

assign out = {W_ADD_L3[0][10],W_ADD_L3[0]} + {W_ADD_L3[1][10],W_ADD_L3[1]};

endmodule

シミュレーションコード:

// 仿真验证模块 add_n8bit 功能
// Xu Y. B.
// 2023 05 13
// 输入有符号数 范围 -128~127

`timescale 1ns / 1ps
module tb_add_n8bit();
parameter NUM_INPUT_1 = 16;
parameter NUM_INPUT_2 = 8;
parameter NUM_INPUT_3 = 4;
parameter NUM_INPUT_4 = 2;

reg 	[NUM_INPUT_1*8-1:0]	in_1;
reg 	[NUM_INPUT_2*8-1:0]	in_2;
reg 	[NUM_INPUT_3*8-1:0]	in_3;
reg 	[NUM_INPUT_4*8-1:0]	in_4;

wire	[12-1:0]			out_1;
wire	[12-1:0]			out_2;
wire	[12-1:0]			out_3;
wire	[12-1:0]			out_4;


add_n8bit #(.NUM_INPUT(NUM_INPUT_1)) inst_add_n8bit_1 (.in(in_1), .out(out_1));
add_n8bit #(.NUM_INPUT(NUM_INPUT_2)) inst_add_n8bit_2 (.in(in_2), .out(out_2));
add_n8bit #(.NUM_INPUT(NUM_INPUT_3)) inst_add_n8bit_3 (.in(in_3), .out(out_3));
add_n8bit #(.NUM_INPUT(NUM_INPUT_4)) inst_add_n8bit_4 (.in(in_4), .out(out_4));

initial
begin
	in_1 = {8'd100,-8'd100,8'd100,-8'd100,
		  8'd120,8'd10,8'd10,-8'd40,
		  8'd106,-8'd125,8'd110,8'd109,
		  8'd100,8'd100,8'd100,8'd100};

	in_2 = {-8'd105,8'd15,8'd107,8'd106,
		  8'd104,-8'd101,8'd15,8'd18};

	in_3 = {8'd30,8'd100,-8'd20,8'd100};

	in_4 = {8'd100,8'd22};
end
endmodule

シミュレーション結果:

 


以上が今回共有するトピックのすべてですが、私の能力の限界を考慮して、異論がある場合はコメント欄で修正してください。

おすすめ

転載: blog.csdn.net/qq_43045275/article/details/130630054