Site hosted by Angelfire.com: Build your free website today!
 
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.