← 2022 · 大疆创新 笔试

推荐答案 测试一下

运行以下程序输出的值是

A.0x1_0000_0000 B.0x2_0000_0000 C.0x14
单选题 中等 笔试真题单选

参考答案

我们分析题目。题目给出了一个SystemVerilog代码片段,要求输出值。选项是A、B、C。需要仔细分析代码。 代码: int addr = 32'ha; // 注意:这里'ha表示16进制,但32'ha应该是32位,a是10,所以addr=32'd10? 实际上32'ha是32位十六进制,值是0xA,也就是10。 bit is_legal = 1; bit[33:0] info0; // 注意:原文是bit[33.0]info0;可能是笔误,应为[33:0]即34位位宽。 initial begin if (addr[0]) // 判断addr最低位是否为1,addr=10 (二进制1010),最低位0,所以条件假 is_legal = 0; else Is_legal = 1; // 注意:这里变量名是is_legal,但这里写成了Is_legal(大写I)。可能是个错误。但SystemVerilog是区分大小写的,所以Is_legal是另一个变量?但前面定义的是is_legal,这里可能是个笔误。通常题目会考察大小写。需要判断。 info0 = ~is_legal; // 取反is_legal,但is_legal初始为1,经过if-else后,因为条件假,执行else分支,但else分支写的是Is_legal=1,注意大小写。Is_legal未定义,可能出错。但题目可能故意将else分支的赋值写成Is_legal,而if条件中addr[0]为0,所以应该执行else。但由于Is_legal是另一个变量,那么is_legal保持初始值1?或者编译器报错?通常笔试中,如果变量名写错,可能视为错误,但这里似乎期望输出值。另一种可能是认为大小写不敏感?但SystemVerilog是大小写敏感的。我们需要根据常见考点推测。 // 实际上,很多题目中会出现这种笔误,考察是否注意大小写。但本题选项很大,可能认为Is_legal就是is_legal,因为印刷问题。但严谨起见,我们假设是同一变量。 // 再看后续:info0 = (info0, addr); 这是拼接操作?SystemVerilog中花括号{ }用于拼接,这里用了圆括号?可能是笔误,应该是{info0, addr}。 // 接着info0 = (info0, 0); 也是拼接。最后$display("0x%0h", info0); // 注意变量位宽:info0是34位,addr是32位,0是1位?拼接时要注意位宽。 // 另外,~is_legal:is_legal是1位bit,取反得0,然后赋值给info0,info0是34位,会进行零扩展?实际上,将1位赋值给34位,高位补0,所以info0 = 34'b0。 // 然后info0 = {info0, addr}:{34位, 32位}得到66位?但赋值给34位info0,会截断低位?实际上拼接结果位宽是34+32=66,然后赋值给34位,取低34位?但通常赋值会截断,但这里可能不是这样。 // 注意:info0 = (info0, addr); 使用圆括号不是标准拼接,可能是表示函数调用?但SystemVerilog中圆括号用于表达式,逗号不是拼接。实际上,可能是印刷错误,应该是{info0, addr}。但题目就是写的(info0, addr),这可能是一个语法错误。在Verilog中,逗号用于连续赋值?不是。所以可能是笔误。 // 另一种理解:可能是(info0, addr)表示一个列表?但SystemVerilog不支持。因此,题目可能只是考察位宽、拼接、取反等。需要根据常见考题推测。 // 观察选项:A.0x1_0000_0000 (36位? 1后面8个0,是36位?0x1_0000_0000是9个十六进制数字,即36位? 实际上0x1_0000_0000 = 2^32? 2^32=0x100000000,即33位1后面8个0? 0x100000000是9个十六进制数字,第一位1,后面8个0,即36位? 实际上2^32=4294967296,十六进制0x100000000,这是33位(因为2^32需要33位表示,最高位是第32位)。但表示成0x1_0000_0000是9个十六进制数字,每个4位,共36位,但前面的0x1是第32-35位?混淆。通常写0x100000000表示33位。但这里带下划线:0x1_0000_0000,可能表示36位(1后面8个0共9位?)。B.0x2_0000_0000,C.0x14(20)。 // 我们需要推算出结果。 // 重新仔细分析,假设所有变量正确,且操作符是标准SystemVerilog。 // 定义: int addr = 32'ha; // 32位,值10 (0xA) bit is_legal = 1; // 1位,值1 bit[33:0] info0; // 34位 initial begin if (addr[0]) // addr的最低位是0 is_legal = 0; else Is_legal = 1; // 这里如果大小写敏感,Is_legal未定义,可能会报错或视为不同变量。但可能题目意图是赋值给is_legal,但写错了。通常笔试题目会忽略这种错误,假设正确。所以认为is_legal被赋值为1(因为else分支执行,但Is_legal可能是一个新变量,那么is_legal保持1不变?实际上,如果Is_legal是另一个未定义的变量,编译器会报错。但题目没有说报错,所以假设是同一变量,忽略大小写。很多考试中不区分大小写?但Verilog区分。所以这里存疑。) // 我们按照常见思路:执行else分支,is_legal = 1,所以is_legal仍为1。 info0 = ~is_legal; // ~1 = 0,

涉及知识点

  • SystemVerilog
← 上一题
登录后反馈错题
下一题 →