Program

本文通过几个C语言程序示例介绍了动态内存分配的方法,包括单个整型变量数组和二维整型数组的分配,并展示了如何使用结构体传递参数。
/*
#include <stdio.h>
#include <math.h>
#define pi 3.1415926
int main()
{
	double x,y;
	printf("x= ");
	while(scanf("%lf",&x)!=EOF)
	{
		if(x>0)
		{
			y=(sqrt(x)+exp(x))/(5*x+5);
		}
		if(x<=0)
		{
			y=((double)2/3+sin((double)pi/3))*fabs(x);
		}
		printf("y= %lf\n",y);
	}
	return 0;
}*/

/*
#include<string.h> 
#include<stdio.h>
struct student
{
	int num;
	char name[10];
	char sex;
	float score;
};

void fun1(struct student t)
{
	t.num=102;strcpy(t.name,"Zhang");
	t.sex='F';t.score=90;
}
void fun2(struct student *p)
{
	p->num=102;strcpy(p->name,"Zhang");
	p->sex='F';p->score=90;
}
int main(){
	struct student x={101,"Zhao",'M',85};
	struct student y={101,"Zhao",'M',85};
	printf("(1)x: %d %s %c %f\n",x.num,x.name,x.sex,x.score);
	fun1(x);
	printf("(2)x: %d %s %c %f\n",x.num,x.name,x.sex,x.score);

	printf("(1)y: %d %s %c %f\n",y.num,y.name,y.sex,y.score);
	fun2(&y);
	printf("(2)y: %d %s %c %f\n",y.num,y.name,y.sex,y.score);

}*/ 

/*#include<stdio.h>
int main()
{
    int a,b,n,i;

    scanf("%d",&i);
    while(i-->0)
    {
        if(i>=30)
            break;
        scanf("%d",&n);
        if(n<2 || n>=10000)
            break;
        for(a=1;a<=n;a+=2)
            printf("%3d",a);
        printf("\n");
        for(b=2;b<=n;b+=2)
            printf("%3d",b);
        printf("\n");
    }
    return 0;
}*/
/*#include<stdio.h>
#include<stdlib.h>//
#include<malloc.h>//这两个头文件任选一个就行了,上面的范围更大
int main()
{
  int n,i;
  scanf("%d",&n);//输入数组大小
  int *p=(int *)calloc(n,sizeof(int));//申请了一个长度为n的数组,用p指向首地址
  for(i=1;i<n;i++)//位数组元素赋值
    {
      scanf("%d",p+i);
      }
  for(i=1;i<n;i++)//输出数组元素
    {
      printf("%d ",*(p+i));
      }
   free(p);//释放申请的内存空间
  return 0;    
}*/
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int *a;
	int n,i;
	scanf("%d",&n);
	a=(int*)calloc(n,sizeof(int));
	for(i=0;i<n;i++)
	scanf("%d",&a[i]);
	for(i=0;i<n;i++)
	printf("%d ",a[i]);
	free(a);
	return 0;
}
/*#include <stdio.h> //包含输入输出函数
#include <stdlib.h>//包含动态内存分配函数。
 
int main()
{
    int **p; //定义二维指针。
    int m, n;//行数和列数。
    int i,j;
     
    scanf("%d%d", &m, &n); //输入行数和列数。
    if(m <= 0 || n <= 0) return -1; //行数或列数非法。
     
    p = (int **) malloc(sizeof(int *) *m);//申请一组一维指针空间。
    for(i = 0; i < m; i ++)
        p[i] = (int *)malloc(sizeof(int) * n); //对于每个一维指针,申请一行数据的空间。
     
    for(i = 0; i < m; i ++)
        for(j = 0; j < n; j ++)
            scanf("%d",&p[i][j]);//输入第i行第j列的数据。其中&p[i][j]也可以写作p[i]+j或者是 *(p+i) + j. 功能相同。
     
    printf("输入的数组为%d行%d列:\n", m, n);
    for(i = 0; i < m; i ++)
    {
        for(j = 0; j < n; j ++)//这个循环可以输出一行元素。
            printf("%d ", p[i][j]);//输出i行j列的元素。
        printf("\n");//每行输入结束加换行符。
    }
     
    //释放内存
    for(i = 0; i < m; i ++)
        free(p[i]);
    free(p);
     
    return 0;
}*/


`program` 块是 SystemVerilog 中用于编写测试平台(TB)的一种结构,以下是关于 `program` 块的详细介绍: ### 主要特点 1. **执行时域**:`program` 块在 reactive 时域执行,而 `module` 在 active 时域执行,所以 `program` 在 `module` 后执行,这有助于解决竞争冒险现象[^1]。 2. **定义嵌套**:`module` 里可以定义 `program`,但 `program` 里不能定义 `module`[^1]。 3. **调用规则**:`module` 里不能调用 `program` 里定义的 `task`、`function`,而 `program` 可以调用 `module` 里定义的 `task` 和 `function`。通常,设计单元(DUT)用 `module`,测试平台(TB)用 `program`,TB 可以例化 DUT,因此 `program` 可以调用 `module` 里的内容,反之则不行[^1]。 4. **内容限制**:`program` 里不能例化 `module`、`interface`、其他 `program`,也不能包含 `always` 块[^1]。 ### 使用方法 以下是一个简单的 `program` 块使用示例: ```systemverilog module dut; reg a, b; wire c; // 简单的逻辑门 assign c = a & b; task set_inputs(input reg in_a, input reg in_b); a = in_a; b = in_b; endtask endmodule program tb; reg clk; dut uut(); initial begin // 初始化时钟 clk = 0; forever #5 clk = ~clk; end initial begin // 调用 module 里的 task uut.set_inputs(1'b0, 1'b0); #10; uut.set_inputs(1'b0, 1'b1); #10; uut.set_inputs(1'b1, 1'b0); #10; uut.set_inputs(1'b1, 1'b1); #10; $finish; end endprogram ``` 在这个示例中,`module dut` 是设计单元,`program tb` 是测试平台。`program` 块中例化了 `dut` 模块,并调用了 `dut` 模块里的 `task set_inputs` 来设置输入信号。 ### 用途 `program` 块主要用于编写测试平台,对设计单元进行功能验证。通过在 `program` 块中产生激励信号,并观察设计单元的输出响应,从而判断设计单元是否符合预期。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值