请用sv进行编程,要求不用randc产生随机数,数组里边数不能重复、并且第八个数为8、最大值为9
时间: 2023-06-17 17:06:19 浏览: 380
以下是使用 sv 编写的产生随机数的代码,满足题目要求:
```sv
module random_number_gen(
input logic clk,
input logic rst_n,
output logic [3:0] random_num
);
logic [3:0] counter;
logic [3:0] tmp;
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
counter <= 0;
tmp <= 0;
end
else begin
counter <= counter + 1;
if (counter == 15) begin
tmp <= {tmp[2:0], ~(tmp[3])};
counter <= 0;
end
end
end
assign random_num = tmp;
endmodule
```
该模块使用 LFSR(线性反馈移位寄存器)算法来产生伪随机数。在每个时钟上升沿时,计数器计数器加 1,当计数器达到 15 时,将生成下一个伪随机数。在每个时钟上升沿时,用 LFSR 算法更新当前伪随机数。在这个模块中,我们使用了一个 4 位计数器和一个 4 位寄存器来实现。最终的随机数存储在一个 4 位输出端口中。
接下来,我们使用该模块来生成满足题目要求的随机数。我们可以使用一个 9 元素的数组来存储随机数,并使用一个循环来填充该数组。我们可以使用 `unique` 关键字来确保数组中的元素不重复。我们还可以使用 `assert` 语句来确保数组中的第八个元素为 8。
```sv
module top();
logic clk, rst_n;
logic [3:0] random_num;
logic [8:0] arr [0:8];
random_number_gen rng (
.clk(clk),
.rst_n(rst_n),
.random_num(random_num)
);
initial begin
clk = 0;
forever #5 clk = ~clk;
end
initial begin
rst_n = 0;
#10 rst_n = 1;
end
integer i;
int unsigned j;
integer count;
integer max_num = 9;
// 初始化数组
for (i = 0; i < 9; i++) begin
arr[i] = 0;
end
// 生成随机数
for (i = 0; i < 9; i++) begin
count = 0;
repeat (1000) begin
random_num = random_num_gen(clk, rst_n);
if (random_num <= max_num && !arr.contains(random_num)) begin
arr[i] = random_num;
break;
end
count++;
end
assert(count < 1000) else $error("Timeout");
end
// 确保第8个数为8
assert(arr[7] == 8) else $error("Invalid number");
// 打印数组
$display("Random number array:");
for (j = 0; j < arr.size(); j++) begin
$display("%d", arr[j]);
end
endmodule
```
该模块首先实例化了上面的随机数生成模块,并初始化了一个 9 元素的数组。然后,使用一个循环来生成随机数并将其存储在数组中。我们使用 `contains` 方法来判断数组中是否已经包含当前随机数,如果包含,则继续生成下一个随机数。我们还使用 `assert` 语句来确保数组中的第八个元素为 8。最后,我们使用 `$display` 语句来打印数组中的元素。
阅读全文