IcarusiverilogでのPLIの使用例

Icarusverilogをインストールします

私はソフトウェアソースコードを提供する教師です。Linux環境はWindowsサブシステムlinuxであり、ubuntuバージョンは18.04です。勝利環境にはもっとバグがあると言われています。Linux環境で次の操作を実行してください
。ftpリンクを指定してください

ftp://ftp.icarus.com/pub/eda/verilog/

ftpサービスを試しませんでした。ftpが失敗した場合は、必要に応じて、yuantaogen @ csu.edu.cnまたは[email protected]に連絡してください。

最初のtar解凍:

次に解凍ディレクトリに

入り、次の手順を怠惰な方法で入力します。
ここに写真の説明を挿入
最後に、権限を昇格してsudoを追加する必要があります。プロセスは非常に流動的です。次の手順を使用して、インストールが成功したかどうかを確認できます。
ここに写真の説明を挿入

LPIの基本的な使用法

使用プロセスでは、インターフェース機能を説明するcファイルと、シミュレーション励起モデルを説明する.vファイルを提供する必要があります。ここでは、hello.cとhello.vは、アプリケーションごとに関数名が変更される可能性があると想定しています。
コンパイルと実行のプロセスは次のとおりです
ここに写真の説明を挿入
。2番目の命令-oの後にスペースが続き、3番目の命令-M。は現在のディレクトリを意味します。-mとhelloは密接に接続されており、スペースは必要ありません。そうでない場合、エラーが報告されます。

修正されたバグ

1.ヘッダーファイルには
gccが含まれています。ファイルを含める場合はパス情報が必要になるため、現在のディレクトリと含める必要のあるファイルに応じてヘッダーファイルを柔軟に変更する必要があります。
私の設計では、Linuxの作業パスはworkOfVPIで
ここに写真の説明を挿入
あり、必要なヘッダーファイルと実装ファイルはverilog-10.3にあるため、ファイルのインクルードは次のように記述する必要があります。#include "./verilog-10.3/vpi_user.h"
二重引用符の使用に注意してください。 、山括弧もエラーを報告します。

2.最後の関数定義中括弧の後にセミコロンを追加する必要があります。
ここに写真の説明を挿入
上の図では、コードのこの部分が最後にあります。セミコロンを追加しないと、エラーが報告されます:入力の最後に[エラー]が必要です '、'、または ';'
セミコロンを追加するだけですが、これは詳細すぎます。

3. Verilog PLIハンドブック2.pdfには、show_all_net.cコードの登録の一部がありません。
つまり、bug2にコードを追加することです。CDがないかどうかはわかりませんが、コードをドキュメントに含めるべきではありません。

コードシェア

show_all_nets.c

#include<stdlib.h>
#include<stdio.h>
#include<stdarg.h>
#include "./verilog-10.3/vpi_user.h"

PLI_INT32 PLIBOOK_ShowNets_compiletf(PLI_BYTE8 *user_data),
		PLIBOOK_ShowNets_calltf(PLI_BYTE8 *user_data);
		
void PLIBOOK_ShowNets_regisger()
{
	s_vpi_systf_data tf_data;
	
	tf_data.type=vpiSysTask;
//	tf_data.sysfunctype=0;
	tf_data.tfname="$show_all_nets";
	tf_data.compiletf=PLIBOOK_ShowNets_compiletf;
	tf_data.calltf=PLIBOOK_ShowNets_calltf;
	tf_data.sizetf=NULL;
	tf_data.user_data=NULL;
	vpi_register_systf(&tf_data);
	return ;
	}
	
PLI_INT32 PLIBOOK_ShowNets_compiletf(PLI_BYTE8 *user_data)
{
	vpiHandle systf_handle,arg_iterator,arg_handle;
	PLI_INT32 tfarg_type ;
	int err_flag=0;
	
	systf_handle=vpi_handle(vpiSysTfCall,NULL);
	arg_iterator=vpi_iterate(vpiArgument,systf_handle);
	
	if(arg_iterator==NULL) {
		vpi_printf("Error :$show_all_nets requires 1 argument\n");
		err_flag=1;
		}
	else {
		arg_handle =vpi_scan(arg_iterator);
		tfarg_type=vpi_get(vpiType,arg_handle);
		if (tfarg_type!=vpiModule) {
			vpi_printf("error :$show_all_nets arg must be module instance\n");
			vpi_free_object(arg_iterator);
			err_flag=1;
			}
		else {
			arg_handle=vpi_scan(arg_iterator);
			if(arg_handle!=NULL) {
				vpi_printf("error:$show_all_nets can only have 1 argument\n");
				vpi_free_object(arg_iterator);
				err_flag=1;
			}
		
		}
	}
	if(err_flag) 
		vpi_control(vpiFinish,1);
	return 0;
}

PLI_INT32 PLIBOOK_ShowNets_calltf(PLI_BYTE8 *user_data)
{
	vpiHandle systf_handle,arg_iterator,module_handle,net_iterator,net_handle;
	s_vpi_time current_time;
	s_vpi_value current_value;
	
	systf_handle=vpi_handle(vpiSysTfCall,NULL);
	arg_iterator=vpi_iterate(vpiArgument,systf_handle);
	module_handle =vpi_scan(arg_iterator);
	vpi_free_object(arg_iterator);
	
	current_time.type=vpiScaledRealTime;
	vpi_get_time(systf_handle,&current_time);
	
	vpi_printf("\nAt time %2.2f, ",current_time.real);
	vpi_printf("net in module %s ",vpi_get_str(vpiFullName,module_handle));
	vpi_printf("(%s):\n",vpi_get_str(vpiDefName,module_handle));
	
	net_iterator=vpi_iterate(vpiNet,module_handle);
	if(net_iterator==NULL)
		vpi_printf("	no nets found in this module\n");
	else {
		current_value.format=vpiBinStrVal;
		while (	(net_handle=vpi_scan(net_iterator))!=NULL) {
			vpi_get_value(net_handle,&current_value);
			vpi_printf("	net %-10s value is %s	(binary) \n",
						vpi_get_str(vpiName,net_handle),
						current_value.value.str);
					}
		}
		return 0;
}

void (*vlog_startup_routines[]) () ={
	PLIBOOK_ShowNets_regisger,
	0
};




show_all_nets.v

`timescale 1ns /1ns
module top;
reg [2:0]test;
tri [1:0]results;
addbit i1 (test[0],test[1],test[2],results[0],results[1]);
initial 
	begin
		test=3'b000;
		#10 test=3'b011;
		#10 $show_all_nets(top);
		#10 $show_all_nets(i1);
		#10 $stop;
		#10 $finish;
	end
endmodule

`timescale 1ns / 1ns
module addbit(a,b,ci,sum,co);
input a,b,ci;
output sum,co;
wire a,b,ci,sum,co,n1,n2,n3;
xor (n1,a,b);
xor #2 (sum,n1,ci);
and (n2,a,b);
and (n3,n1,ci);
or #2 (co,n2,n3);
endmodule

実行結果

ここに写真の説明を挿入
最後に、finishと入力してシミュレーションを終了し、シェルに戻ります。

おすすめ

転載: blog.csdn.net/qq_44801767/article/details/109275209