Doing UNIX stuffs in
Verilog
Swapnajit Mittra
It all started when somebody (with little imagination, probably one of Brian
Kernighan or Dennis Ritchie) wanted to execute a shell command from a C program.
For example, if you want to list the contents of the current directory from
your C program, it takes more than just the basic knowledge of C libraries.
But, within a shell, all you need to do is just "ls -l". So why bother writing
pages of code, if somehow you can invoke an "ls -l" and pass it to the shell
!
So, the C system call system() was born and was placed in
stdlib.h. If you call system("ls -l") from your C program,
it will list the directory structure for you.
When Verilog was created and, later standardized, somehow this important
utility was ignored. As a result, standard Verilog does not have a way to
interact with the shell.
Both Verilog-XL and VCS provides a non-stadard system task
$system()which does an equivalent job. You can invoke $system("ls
-l") from your Verilog program to list the contents of the current
directory.
Now, each command executed in a shell returns an exit status to the shell.
Analyzing the exit status is important for analyzing and debugging
the command (imagine the shell command to be a perl program or binary executable,
rather than just "ls -l"). Since $system() is a system task and,
not a system function, there is no way that a Verilog program can get that
information.
This is where the following system call $my_system() can be useful.
It reads in a shell command in form of a string, execute it and then return
the exit status as an integer (32bit).
For sake of brevity, only the calltf function is shown here.
#include <stdlib.h>
#include <veriuser.h>
calltf_my_system() {
tf_putp(0, system(tf_strgetp(1)));
}
|
Note, there is just one line in this function even though it does all these
: it reads the input argument, executes it and then return the exit
status.
Vineyard Research Inc.
|