1. 基本数据类型取值与运算给定代码片段byte my_byte; integer my_integer; int my_int; bit [15:0] my_bit; shortint my_short_int1; shortint my_short_int2; my_integer 32b000_1111_xxxx_zzzz; my_int my_integer; my_bit 16h8000; my_short_int1 my_bit; my_short_int2 my_short_int1 - 1;解答a.my_byte取值范围byte是有符号 8 位类型范围为 −128∼127。b.my_int的十六进制值int与integer均为 32 位故my_int 32h0x00000F00或32h0xF00c.my_bit的十进制值16h8000 32768。d.my_short_int1的十进制值shortint是有符号 16 位16h8000对应最小值 −32768。e.my_short_int2的十进制值-32768 - 1溢出后结果为 32767。2. 数组赋值合法性判断给定初始化代码bit [7:0] my_mem[3]; // 索引0~2 logic [3:0] my_logicmem[4]; // 索引0~3 logic [3:0] my_logic; my_mem {default:8hA5}; my_logicmem {0,1,2,3}; my_logic 4hF;解答my_mem[2] my_logicmem[4];my_logicmem[4]越界非法。my_logicmem[4] my_logic;my_logicmem[4]越界非法。my_logicmem[3] my_mem[3];my_mem[3]越界非法。my_mem[3] my_logic;my_mem[3]越界非法。my_logic my_logicmem[1];合法my_logic 4h1。my_logic my_mem[1];合法截断后my_logic 4h5。my_logic my_logicmem[my_logicmem[4]];my_logicmem[4]越界非法。3. 双状态数组声明与遍历解答a. 声明 2 状态数组my_array是2 状态bit、4 个元素、每个元素 12 位的数组bit [11:0] my_array[4]; // 2状态bit4个元素每个12位b. 初始化my_arrayinitial begin my_array[0] 12h012; my_array[1] 12h345; my_array[2] 12h678; my_array[3] 12h9AB; endc. 遍历my_array并打印每个元素的[5:4]位for 循环实现initial begin for (int i0; i4; i) begin $display(my_array[%0d][5:4] %b, i, my_array[i][5:4]); end endforeach 循环实现initial begin foreach (my_array[i]) begin $display(my_array[%0d][5:4] %b, i, my_array[i][5:4]); end end4. 非打包多维数组需求声明 5×31 的 4 状态非打包数组判断赋值合法性。代码与解析module unpacked_array; // 声明5×31非打包数组4状态 logic my_array1[5][31]; initial begin // 合法赋值my_array1[4][30]索引不越界 my_array1[4][30] 1b1; // 非法赋值my_array1[29][4]行索引294、my_array1[1][32]列索引3230 end endmodule5. 打包多维数组需求声明 5×31 的 2 状态打包数组判断赋值合法性。代码与解析module packed_array; // 声明5×31打包数组2状态 bit [4:0][30:0] my_array2; initial begin // 合法赋值my_array2[4][30]索引不越界 my_array2[4][30] 1b1; // 非法赋值my_array2[29][4]行索引294、my_array2[1][32]列索引3230 end endmodule6. 动态字符串队列输出分析给定代码module queue_demo; string street[$]; initial begin street {Rejon, Bijou, Boulder}; $display(street[0] %s, street[0]); street.insert(2, Platte); $display(street[2] %s, street[2]); street.push_front(Vrain); $display(street[2] %s, street[2]); $display(pop_back %s, street.pop_back); $display(street.size %0d, street.size); end endmodule输出结果street[0] Rejon street[2] Platte street[2] Bijou pop_back Boulder street.size 47. 处理器内存模拟需求用关联数组模拟 24 位字宽、220地址空间的内存。代码实现module mem_sim; // a. 声明关联数组地址→24位数据 bit [23:0] mem[int]; initial begin // b. 填充内存指令 mem[0] 24hA5400; // 地址0跳转到0x400 mem[0x400] 24h123096; // 地址0x400指令1 mem[0x401] 24h789ABC; // 地址0x401指令2 mem[0xFFFFF] 24h0F1E2D; // 最大地址ISR中断返回 // c. 打印内存元素与个数 int count 0; $display( 内存元素 ); foreach (mem[addr]) begin $display(地址0x%h: 数据0x%h, addr, mem[addr]); count; end $display(元素总数: %0d, count); end endmodule8. 3 字节队列的运算与排序需求实现队列的求和、极值、排序、反转等操作。代码实现module queue_operations; // a. 初始化3字节队列 byte queue[$] {2, -1, 127}; initial begin // b. 打印队列和 int sum 0; foreach (queue[i]) sum queue[i]; $display(队列和: %0d, sum); // c. 打印最值 byte min_val queue[0], max_val queue[0]; foreach (queue[i]) begin min_val (queue[i] min_val) ? queue[i] : min_val; max_val (queue[i] max_val) ? queue[i] : max_val; end $display(最小值: %0d, 最大值: %0d, min_val, max_val); // d. 排序并打印 queue.sort(); $display(排序后队列: %p, queue); // e. 打印负数索引 $display(负数索引:); foreach (queue[i]) if (queue[i] 0) $display(索引%d, i); // f. 打印正数 $display(正数:); foreach (queue[i]) if (queue[i] 0) $display(%0d, queue[i]); // g. 反转排序后的队列 queue.reverse(); $display(反转后队列: %p, queue); end endmodule9. 7 位类型与数据包封装需求定义 7 位类型封装数据包结构并赋值。代码实现module packet_struct; // 定义7位自定义类型 typedef logic [6:0] my_7bit_t; // 封装数据包结构体 typedef struct packed { my_7bit_t header; // 27~21位 my_7bit_t cmd; // 20~14位 my_7bit_t data; // 13~7位 my_7bit_t crc; // 6~0位 } packet_t; // 赋值并打印 initial begin packet_t pkt; pkt.header 7h5A; // 给header赋值 $display(数据包header: 0x%h, pkt.header); end endmodule10. nibble 类型与数组流需求定义 4 位 nibble 类型实现数组流与类型转换。代码实现module nibble_ops; // a. 定义4位自定义类型 typedef logic [3:0] nibble; // b. 实数初始化 real r 4.33; // c. 非打包数组 int i_pack; // d. 打包数组初始化 nibble k[4] {4h0, 4hF, 4hE, 4hD}; initial begin // e. 打印k $display(初始k: %p, k); // f. 按位从右到左流入i_pack i_pack 0; foreach (k[i]) begin for (int j0; j4; j) i_pack {i_pack[15:1], k[i][j]}; end $display(按位流入i_pack: 0x%h, i_pack); // g. 按nibble从右到左流入i_pack i_pack 0; for (int i3; i0; i--) i_pack {i_pack[11:0], k[i]}; $display(按nibble流入i_pack: 0x%h, i_pack); // h. 实数转nibble并赋值 k[0] nibble(r); // 取整数部分4 $display(转换后k: %p, k); end endmodule