C shell 学习
目录
#!/bin/csh -f
set命令:
$#argv
${SIM_DEFINE}
=~
shift
vhdlan -full64 -f xxa.g -l xxb.log
VHDL 和verilog
#!/bin/csh -f
#!
(Shebang):指定脚本解释器的路径,系统根据该行决定用哪个程序执行脚本。/bin/csh
:C Shell(csh
)的解释器路径,常见于Unix/Linux系统。-f
参数:快速启动模式,跳过读取用户配置文件(如~/.cshrc
)。
set build = 0;
set c_testname = "fc_example";
#set ct_comp = 0;
set
命令:
用于定义或修改变量。 字符串用“”
# 注释符号,
set testname = $argv[1];
$argv
是 C Shell 中的 特殊数组变量,用于存储 脚本或函数的所有命令行参数。
$argv[1],
命令行第一个参数(索引从1开始)
while ($#argv > 0)
if("x$1" =~ x-build) ## 检查当前参数是否为 "-build"
then
set build = 1; # 如果是,设置标志位 build=1
endif
$#argv
$#argv
是 C Shell (csh
/tcsh
) 中的特殊变量,表示 命令行参数的数量(类似 Bash 中的 $#
)。while ($#argv > 0)
表示“只要还有未处理的参数,就继续循环”。
./script.csh -build -debug # 此时 $#argv = 2
"x$1", $1
是 命令行参数的引用,表示传递给脚本或函数的 第一个参数。$1 为 -build
x$1 是将当前参数 $1
前缀拼接字母 x
(防变量为空导致语法错误)
${SIM_DEFINE}
$
:变量引用的起始符号(表示“取变量的值”)。{}
:明确变量名的边界。
if ($comp_en == "0") then
set SIM_DEFINE = "${SIM_DEFINE}+NO_CLUSTER";
endif
举例:
set SIM_DEFINE = "DEBUG"
echo "$SIM_DEFINE_123" # 尝试读取不存在的变量 `SIM_DEFINE_123`
echo "${SIM_DEFINE}_123" # 正确输出 "DEBUG_123" ,用{} 划定边界
=~
=~ 正则表达式匹配操作符。
if.....then...... 固定搭配
if ($build_only == "1") then
set c_comp = 0;
set build = 1;
set clean = 0;
set sim = 0;
endif
检查 build_only
是否为字符串 "1"
shift
shift
是 Shell 脚本中的 参数位移命令,用于移除参数列表 ($argv
或 $*
) 中的 第一个参数(即 $1
),并将后续参数依次前移。
假设命令行输入:./script.csh -c_opts "-O2 -g" -build
if ("x$1" =~ x-c_opts) then #
# 如果当前参数是 "-c_opts"
shift
# 移除 "-c_opts",此时原来的 $2 变成新的 $1
set c_opts = "${c_opts} $1";
# 将新的 $1(原$2的值)追加到 c_opts
endif
执行前:•$1
= "-c_opts"
$2
= "-O2 -g"
$3
= "-build
执行后:•shift
移除 -c_opts
,原 $2
变为新 $1,
c_opts
被赋值为 " -O2 -g"
(保留历史值并追加新值)
shift
的核心作用
场景 | | 参数变化示例 |
---|---|---|
处理选项参数 | 移除选项标识(如 |
|
遍历所有参数 | 配合循环逐个处理参数 |
|
忽略已处理参数 | 避免重复处理同一参数 | 处理完 |
if ....endif
if ........then
语句;
else if .....then
语句;
endif
if("x$1" =~ x-nodump) then
set nodump = 1;
endifif ("x$1" =~ x-debug) then
set uvm_verbosity = "UVM_MEDIUM";
else if ("x$1" =~ x-debug_high) then
set uvm_verbosity = "UVM_HIGH";
else if ("x$1" =~ x-debug_full) then
set uvm_verbosity = "UVM_FULL";
else if ("x$1" =~ x-debug_none) then
set uvm_verbosity = "UVM_NONE";
else if ("x$1" =~ x-debug_debug) then
set uvm_verbosity = "UVM_DEBUG";
endif
while
while ($#argv > 0)
# 处理当前参数 $argv[1]
shift # 移除已处理的参数
end
echo
echo
是 Shell 脚本中最常用的 文本输出命令,用于:
。打印字符串到终端或文件
。显示变量值 #echo "$output_dir"
。调试时输出中间结果
C shell : printf "Line1\nLine2\n" # 推荐用 printf
vhdlan -full64 -f xxa.g -l xxb.log
该命令用于调用 VHDL 编译器(如 Synopsys 的 vhdlan
)编译指定的 VHDL 文件,生成仿真或综合所需的中间文件。
参数 | 作用 | 示例值/说明 |
---|---|---|
| 启用 64 位模式编译(兼容 64 位系统) | 必需参数,避免 32/64 位兼容问题 |
| 指定文件列表路径( | 文件内容示例: |
| 将编译日志输出到指定文件( | 日志包含错误、警告和编译状态 |
VHDL 和verilog
1. 核心定位
两者均为 硬件描述语言(HDL),用于数字电路的设计、仿真和综合,是芯片开发(FPGA/ASIC)的行业标准工具。
差异定位:
特性 | VHDL | Verilog |
---|---|---|
设计哲学 | 强类型、严谨(适合高可靠性系统) | 灵活、简洁(适合快速迭代) |
语法风格 | 类似Ada/Pascal(冗长但明确) | 类似C语言(紧凑但易混淆) |
应用领域 | 欧洲军工/航天/医疗主流 | 美国商业电子/AI芯片主流 |