delete vivado-sim-workspace
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"eval_id": 1,
|
||||
"eval_name": "axis-fifo-handshake-sim",
|
||||
"prompt": "我有一个 AXI-Stream FIFO 模块,接口如下:input clk, input rst_n, input [7:0] s_tdata, input s_tvalid, output s_tready, output [7:0] m_tdata, output m_tvalid, input m_tready, output [3:0] fill_count。请帮我生成 testbench,模拟正常的 tvalid/tready 握手时序,用批处理模式在 Vivado 中运行仿真。",
|
||||
"assertions": []
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
// AXI-Stream FIFO 模块(测试用,深度4)
|
||||
module axis_fifo #(
|
||||
parameter DATA_WIDTH = 8,
|
||||
parameter DEPTH = 4
|
||||
)(
|
||||
input wire clk,
|
||||
input wire rst_n,
|
||||
// 从机(写入)端口
|
||||
input wire [DATA_WIDTH-1:0] s_tdata,
|
||||
input wire s_tvalid,
|
||||
output wire s_tready,
|
||||
// 主机(读出)端口
|
||||
output wire [DATA_WIDTH-1:0] m_tdata,
|
||||
output wire m_tvalid,
|
||||
input wire m_tready
|
||||
);
|
||||
|
||||
reg [DATA_WIDTH-1:0] mem [0:DEPTH-1];
|
||||
reg [$clog2(DEPTH):0] wr_ptr, rd_ptr, count;
|
||||
|
||||
assign s_tready = (count < DEPTH);
|
||||
assign m_tvalid = (count > 0);
|
||||
assign m_tdata = mem[rd_ptr[$clog2(DEPTH)-1:0]];
|
||||
|
||||
always @(posedge clk or negedge rst_n) begin
|
||||
if (!rst_n) begin
|
||||
wr_ptr <= 0; rd_ptr <= 0; count <= 0;
|
||||
end else begin
|
||||
if (s_tvalid && s_tready) begin
|
||||
mem[wr_ptr[$clog2(DEPTH)-1:0]] <= s_tdata;
|
||||
wr_ptr <= wr_ptr + 1;
|
||||
count <= count + 1;
|
||||
end
|
||||
if (m_tvalid && m_tready) begin
|
||||
rd_ptr <= rd_ptr + 1;
|
||||
count <= count - 1;
|
||||
end
|
||||
// 同时读写(count 保持不变已在上面分开处理,这里修正)
|
||||
if (s_tvalid && s_tready && m_tvalid && m_tready) begin
|
||||
count <= count; // 读写同时,count 不变
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
@@ -1,26 +0,0 @@
|
||||
# Vivado 批处理仿真脚本 - AXI-Stream FIFO 测试
|
||||
# 测试用例2:用户口头描述接口,生成握手时序激励,批处理模式运行
|
||||
|
||||
# 创建仿真工程
|
||||
create_project -force sim_proj ./sim_proj -part xc7a200tfbg676-2
|
||||
set_property simulator_language Verilog [current_project]
|
||||
|
||||
# 添加源文件(被测模块)
|
||||
add_files -norecurse ./axis_fifo.v
|
||||
|
||||
# 添加仿真文件(testbench)
|
||||
add_files -fileset sim_1 -norecurse ./tb_axis_fifo.v
|
||||
|
||||
# 设置顶层模块为 testbench
|
||||
set_property top tb_axis_fifo [get_filesets sim_1]
|
||||
set_property top_lib xil_defaultlib [get_filesets sim_1]
|
||||
|
||||
# 设置仿真运行时间(握手时序需要足够时间)
|
||||
set_property -name {xsim.simulate.runtime} -value {2000ns} -objects [get_filesets sim_1]
|
||||
|
||||
# 运行仿真(批处理模式,不启动 GUI)
|
||||
launch_simulation
|
||||
run all
|
||||
close_sim
|
||||
|
||||
exit
|
||||
@@ -1,118 +0,0 @@
|
||||
`timescale 1ns/1ps
|
||||
|
||||
module tb_axis_fifo;
|
||||
|
||||
// ---- 参数 ----
|
||||
parameter CLK_PERIOD = 10; // 100 MHz 时钟,周期 10ns
|
||||
|
||||
// ---- 信号声明 ----
|
||||
reg clk;
|
||||
reg rst_n;
|
||||
|
||||
// AXI-Stream 写端口(Master -> FIFO)
|
||||
reg [7:0] s_tdata;
|
||||
reg s_tvalid;
|
||||
wire s_tready;
|
||||
|
||||
// AXI-Stream 读端口(FIFO -> Slave)
|
||||
wire [7:0] m_tdata;
|
||||
wire m_tvalid;
|
||||
reg m_tready;
|
||||
|
||||
// ---- 被测模块例化 ----
|
||||
axis_fifo uut (
|
||||
.clk (clk),
|
||||
.rst_n (rst_n),
|
||||
.s_tdata (s_tdata),
|
||||
.s_tvalid (s_tvalid),
|
||||
.s_tready (s_tready),
|
||||
.m_tdata (m_tdata),
|
||||
.m_tvalid (m_tvalid),
|
||||
.m_tready (m_tready)
|
||||
);
|
||||
|
||||
// ---- 时钟生成 ----
|
||||
initial clk = 0;
|
||||
always #(CLK_PERIOD/2) clk = ~clk;
|
||||
|
||||
// ---- 任务:发送一个 AXI-Stream 数据包 ----
|
||||
task axis_write;
|
||||
input [7:0] data;
|
||||
begin
|
||||
s_tdata = data;
|
||||
s_tvalid = 1;
|
||||
// 等待 tready 握手完成
|
||||
@(posedge clk);
|
||||
while (!s_tready) @(posedge clk);
|
||||
s_tvalid = 0;
|
||||
end
|
||||
endtask
|
||||
|
||||
// ---- 任务:读一个 AXI-Stream 数据包 ----
|
||||
task axis_read;
|
||||
begin
|
||||
m_tready = 1;
|
||||
// 等待 tvalid 握手完成
|
||||
@(posedge clk);
|
||||
while (!m_tvalid) @(posedge clk);
|
||||
m_tready = 0;
|
||||
end
|
||||
endtask
|
||||
|
||||
// ---- VCD 波形记录 ----
|
||||
initial begin
|
||||
$dumpfile("tb_axis_fifo.vcd");
|
||||
$dumpvars(0, tb_axis_fifo);
|
||||
end
|
||||
|
||||
// ---- 复位与激励 ----
|
||||
initial begin
|
||||
// 初始化所有信号
|
||||
s_tdata = 8'h00;
|
||||
s_tvalid = 0;
|
||||
m_tready = 0;
|
||||
|
||||
// 复位序列
|
||||
rst_n = 0;
|
||||
repeat(5) @(posedge clk);
|
||||
rst_n = 1;
|
||||
repeat(2) @(posedge clk);
|
||||
|
||||
// 测试1:连续写入 4 个数据
|
||||
$display("[%0t] 开始测试:连续写入4个数据", $time);
|
||||
axis_write(8'hAA);
|
||||
axis_write(8'hBB);
|
||||
axis_write(8'hCC);
|
||||
axis_write(8'hDD);
|
||||
repeat(2) @(posedge clk);
|
||||
|
||||
// 测试2:连续读出 4 个数据
|
||||
$display("[%0t] 开始读出数据", $time);
|
||||
axis_read();
|
||||
axis_read();
|
||||
axis_read();
|
||||
axis_read();
|
||||
repeat(2) @(posedge clk);
|
||||
|
||||
// 测试3:写入同时读出(背压测试)
|
||||
$display("[%0t] 背压测试:写入同时读出", $time);
|
||||
fork
|
||||
begin
|
||||
axis_write(8'h11);
|
||||
axis_write(8'h22);
|
||||
axis_write(8'h33);
|
||||
end
|
||||
begin
|
||||
repeat(3) @(posedge clk);
|
||||
m_tready = 1;
|
||||
repeat(10) @(posedge clk);
|
||||
m_tready = 0;
|
||||
end
|
||||
join
|
||||
|
||||
repeat(10) @(posedge clk);
|
||||
$display("[%0t] 仿真完成", $time);
|
||||
$finish;
|
||||
end
|
||||
|
||||
endmodule
|
||||
@@ -1,43 +0,0 @@
|
||||
{
|
||||
"eval_id": 0,
|
||||
"eval_name": "counter8-auto-stim",
|
||||
"prompt": "我有一个8位计数器模块,文件路径是 counter8.v,请帮我自动生成激励,运行仿真,并将波形保存到 D:/sim_results/counter_waves.csv",
|
||||
"assertions": [
|
||||
{
|
||||
"id": "tb_file_exists",
|
||||
"text": "生成了 tb_counter8.v testbench 文件"
|
||||
},
|
||||
{
|
||||
"id": "tb_has_dumpfile",
|
||||
"text": "testbench 包含 $dumpfile 和 $dumpvars,用于 VCD 波形记录"
|
||||
},
|
||||
{
|
||||
"id": "tb_has_clkgen",
|
||||
"text": "testbench 包含时钟生成逻辑(always #N clk = ~clk)"
|
||||
},
|
||||
{
|
||||
"id": "tb_has_reset",
|
||||
"text": "testbench 包含复位序列"
|
||||
},
|
||||
{
|
||||
"id": "tb_has_finish",
|
||||
"text": "testbench 包含 $finish 以正常结束仿真"
|
||||
},
|
||||
{
|
||||
"id": "tcl_file_exists",
|
||||
"text": "生成了 run_sim.tcl Vivado 批处理脚本"
|
||||
},
|
||||
{
|
||||
"id": "tcl_batch_mode",
|
||||
"text": "TCL 脚本使用批处理模式(-mode batch)运行"
|
||||
},
|
||||
{
|
||||
"id": "vcd_to_csv_exists",
|
||||
"text": "提供了 vcd_to_csv.py 波形转换脚本"
|
||||
},
|
||||
{
|
||||
"id": "output_path_correct",
|
||||
"text": "CSV 输出路径指向用户指定的 D:/sim_results/counter_waves.csv"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
// 8位计数器模块
|
||||
module counter8 (
|
||||
input wire clk, // 系统时钟
|
||||
input wire rst_n, // 低有效复位
|
||||
input wire en, // 使能信号
|
||||
output reg [7:0] count, // 计数输出
|
||||
output wire overflow // 溢出标志(count == 8'hFF)
|
||||
);
|
||||
|
||||
assign overflow = (count == 8'hFF) & en;
|
||||
|
||||
always @(posedge clk or negedge rst_n) begin
|
||||
if (!rst_n)
|
||||
count <= 8'h00;
|
||||
else if (en)
|
||||
count <= count + 1'b1;
|
||||
end
|
||||
|
||||
endmodule
|
||||
@@ -1,31 +0,0 @@
|
||||
# Vivado 批处理仿真脚本 - 8位计数器
|
||||
# 由 vivado-sim 技能自动生成
|
||||
|
||||
# 创建仿真工程
|
||||
create_project -force sim_proj ./sim_proj -part xc7a200tfbg676-2
|
||||
set_property simulator_language Verilog [current_project]
|
||||
|
||||
# 添加设计源文件
|
||||
add_files -norecurse ./counter8.v
|
||||
|
||||
# 添加仿真文件
|
||||
add_files -fileset sim_1 -norecurse ./tb_counter8.v
|
||||
|
||||
# 设置顶层仿真模块
|
||||
set_property top tb_counter8 [get_filesets sim_1]
|
||||
set_property top_lib xil_defaultlib [get_filesets sim_1]
|
||||
|
||||
# 设置仿真时长(100个时钟周期 × 10ns = 1000ns,留一些余量用2000ns)
|
||||
set_property -name {xsim.simulate.runtime} -value {2000ns} -objects [get_filesets sim_1]
|
||||
|
||||
# 启动仿真
|
||||
launch_simulation
|
||||
|
||||
# 运行仿真
|
||||
run all
|
||||
|
||||
# 关闭仿真
|
||||
close_sim
|
||||
|
||||
# 退出 Vivado
|
||||
exit
|
||||
@@ -1,72 +0,0 @@
|
||||
`timescale 1ns/1ps
|
||||
|
||||
module tb_counter8;
|
||||
|
||||
// ---- 参数 ----
|
||||
parameter CLK_PERIOD = 10; // 100MHz 时钟,周期 10ns
|
||||
|
||||
// ---- 信号声明 ----
|
||||
reg clk;
|
||||
reg rst_n;
|
||||
reg en;
|
||||
wire [7:0] count;
|
||||
wire overflow;
|
||||
|
||||
// ---- 被测模块例化 ----
|
||||
counter8 uut (
|
||||
.clk (clk),
|
||||
.rst_n (rst_n),
|
||||
.en (en),
|
||||
.count (count),
|
||||
.overflow (overflow)
|
||||
);
|
||||
|
||||
// ---- 时钟生成 ----
|
||||
initial clk = 0;
|
||||
always #(CLK_PERIOD/2) clk = ~clk;
|
||||
|
||||
// ---- VCD 波形记录 ----
|
||||
initial begin
|
||||
$dumpfile("tb_counter8.vcd");
|
||||
$dumpvars(0, tb_counter8);
|
||||
end
|
||||
|
||||
// ---- 复位与激励 ----
|
||||
initial begin
|
||||
// 初始化
|
||||
rst_n = 0;
|
||||
en = 0;
|
||||
|
||||
// 复位保持 5 个时钟周期
|
||||
repeat(5) @(posedge clk);
|
||||
rst_n = 1;
|
||||
|
||||
// 使能计数,连续计数 200 个周期
|
||||
@(posedge clk);
|
||||
en = 1;
|
||||
repeat(200) @(posedge clk);
|
||||
|
||||
// 暂停使能,观察保持行为
|
||||
en = 0;
|
||||
repeat(10) @(posedge clk);
|
||||
|
||||
// 重新使能,再计数 60 个周期(观察溢出行为)
|
||||
en = 1;
|
||||
repeat(60) @(posedge clk);
|
||||
|
||||
// 再次复位
|
||||
rst_n = 0;
|
||||
repeat(3) @(posedge clk);
|
||||
rst_n = 1;
|
||||
repeat(5) @(posedge clk);
|
||||
|
||||
$finish;
|
||||
end
|
||||
|
||||
// ---- 监控关键事件 ----
|
||||
always @(posedge clk) begin
|
||||
if (overflow)
|
||||
$display("[%0t ns] 溢出! count = %0d", $time, count);
|
||||
end
|
||||
|
||||
endmodule
|
||||
@@ -1,90 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""将 VCD 波形文件转换为 CSV 格式"""
|
||||
import re
|
||||
import csv
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
def parse_vcd(vcd_path):
|
||||
signals = {} # id_char -> (name, width)
|
||||
changes = [] # (time, id_char, value)
|
||||
current_time = 0
|
||||
|
||||
with open(vcd_path, 'r') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if not line:
|
||||
continue
|
||||
|
||||
# 解析信号定义
|
||||
m = re.match(r'\$var\s+\w+\s+(\d+)\s+(\S+)\s+(\S+)', line)
|
||||
if m:
|
||||
width, id_char, name = int(m.group(1)), m.group(2), m.group(3)
|
||||
signals[id_char] = (name, width)
|
||||
continue
|
||||
|
||||
# 时间戳
|
||||
m = re.match(r'#(\d+)', line)
|
||||
if m:
|
||||
current_time = int(m.group(1))
|
||||
continue
|
||||
|
||||
# 标量变化: 0a 1b xc
|
||||
m = re.match(r'([01xzXZ])(\S+)', line)
|
||||
if m:
|
||||
val, id_char = m.group(1), m.group(2)
|
||||
if id_char in signals:
|
||||
changes.append((current_time, id_char, val))
|
||||
continue
|
||||
|
||||
# 向量变化: b1010 a
|
||||
m = re.match(r'[bB]([01xzXZ_]+)\s+(\S+)', line)
|
||||
if m:
|
||||
val_str, id_char = m.group(1).replace('_',''), m.group(2)
|
||||
if id_char in signals:
|
||||
changes.append((current_time, id_char, val_str))
|
||||
continue
|
||||
|
||||
return signals, changes
|
||||
|
||||
def vcd_to_csv(vcd_path, csv_path):
|
||||
signals, changes = parse_vcd(vcd_path)
|
||||
if not signals:
|
||||
print("未找到信号定义,请检查 VCD 文件")
|
||||
return
|
||||
|
||||
time_events = {}
|
||||
for t, id_char, val in changes:
|
||||
if t not in time_events:
|
||||
time_events[t] = {}
|
||||
time_events[t][id_char] = val
|
||||
|
||||
sig_ids = list(signals.keys())
|
||||
sig_names = [signals[i][0] for i in sig_ids]
|
||||
current_vals = {i: 'x' for i in sig_ids}
|
||||
|
||||
rows = []
|
||||
for t in sorted(time_events.keys()):
|
||||
current_vals.update(time_events[t])
|
||||
row = {'time_ns': t}
|
||||
for i, name in zip(sig_ids, sig_names):
|
||||
row[name] = current_vals[i]
|
||||
rows.append(row)
|
||||
|
||||
if not rows:
|
||||
print("没有波形数据")
|
||||
return
|
||||
|
||||
fieldnames = ['time_ns'] + sig_names
|
||||
with open(csv_path, 'w', newline='') as f:
|
||||
writer = csv.DictWriter(f, fieldnames=fieldnames)
|
||||
writer.writeheader()
|
||||
writer.writerows(rows)
|
||||
|
||||
print(f"已导出 {len(rows)} 个时间点,{len(sig_names)} 个信号到 {csv_path}")
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) < 3:
|
||||
print(f"用法: python vcd_to_csv.py <input.vcd> <output.csv>")
|
||||
sys.exit(1)
|
||||
vcd_to_csv(sys.argv[1], sys.argv[2])
|
||||
@@ -1,27 +0,0 @@
|
||||
{
|
||||
"eval_id": 2,
|
||||
"eval_name": "dff-sync-rst-gui-mode",
|
||||
"prompt": "我有一个带同步复位的 D触发器模块 dff_sync_rst.v,路径是 D:/fpga/dff_sync_rst.v。请帮我在 Vivado GUI 模式下运行仿真,同时也生成 CSV 文件保存到 D:/sim_results/dff_waves.csv",
|
||||
"assertions": [
|
||||
{
|
||||
"id": "tb_generated",
|
||||
"text": "生成了 tb_dff_sync_rst.v 文件,包含时钟生成、复位序列和 D 输入激励",
|
||||
"check": "file_exists:tb_dff_sync_rst.v"
|
||||
},
|
||||
{
|
||||
"id": "gui_tcl_correct",
|
||||
"text": "run_sim_gui.tcl 中使用 GUI 模式(不含 -mode batch,不含 close_sim 和 exit)",
|
||||
"check": "file_not_contains:run_sim_gui.tcl:-mode batch"
|
||||
},
|
||||
{
|
||||
"id": "vcd_dump_in_tb",
|
||||
"text": "testbench 包含 $dumpfile 和 $dumpvars 语句以记录波形",
|
||||
"check": "file_contains:tb_dff_sync_rst.v:$dumpfile"
|
||||
},
|
||||
{
|
||||
"id": "vcd_to_csv_mentioned",
|
||||
"text": "提供了 vcd_to_csv.py 脚本或明确说明如何导出 CSV",
|
||||
"check": "file_exists:vcd_to_csv.py"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
// 带同步复位的 D 触发器
|
||||
module dff_sync_rst (
|
||||
input wire clk, // 时钟
|
||||
input wire rst, // 同步复位(高有效)
|
||||
input wire d, // 数据输入
|
||||
output reg q // 数据输出
|
||||
);
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (rst)
|
||||
q <= 1'b0;
|
||||
else
|
||||
q <= d;
|
||||
end
|
||||
|
||||
endmodule
|
||||
@@ -1,42 +0,0 @@
|
||||
# Vivado 仿真 TCL 脚本 - GUI 交互模式(用户可在 Vivado 中直接查看波形)
|
||||
# 模块: dff_sync_rst(同步复位 D 触发器)
|
||||
# 注意: 此脚本不包含 close_sim 和 exit,Vivado 将保持打开状态
|
||||
|
||||
# 创建工程
|
||||
create_project -force sim_proj ./sim_proj -part xc7a200tfbg676-2
|
||||
set_property simulator_language Verilog [current_project]
|
||||
|
||||
# 添加源文件(请将路径替换为实际路径)
|
||||
add_files -norecurse dff_sync_rst.v
|
||||
add_files -fileset sim_1 -norecurse tb_dff_sync_rst.v
|
||||
|
||||
# 更新 IP 编译顺序
|
||||
update_compile_order -fileset sources_1
|
||||
update_compile_order -fileset sim_1
|
||||
|
||||
# 设置顶层为 testbench
|
||||
set_property top tb_dff_sync_rst [get_filesets sim_1]
|
||||
set_property top_lib xil_defaultlib [get_filesets sim_1]
|
||||
|
||||
# 仿真设置 - GUI 模式运行足够长时间以便观察
|
||||
set_property -name {xsim.simulate.runtime} -value {500ns} -objects [get_filesets sim_1]
|
||||
|
||||
# 启动仿真(GUI 模式)
|
||||
launch_simulation
|
||||
|
||||
# 运行全部激励
|
||||
run all
|
||||
|
||||
# ---- GUI 模式特有操作 ----
|
||||
# 以下命令在 GUI 打开后添加所有信号到波形窗口
|
||||
# add_wave /tb_dff_sync_rst/*
|
||||
# 用户可在 Vivado 波形窗口中手动缩放/查看
|
||||
|
||||
# 注意: 不加 close_sim 和 exit,让 Vivado GUI 保持打开
|
||||
# 用户可以在 Vivado 界面中:
|
||||
# 1. 在 Waveform 窗口查看所有信号
|
||||
# 2. 使用 File > Export > Export Simulation 导出数据
|
||||
# 3. 手动运行更长时间: run 1000ns
|
||||
|
||||
# 同时也生成 VCD 文件,以便后续转换为 CSV
|
||||
# (testbench 中已包含 $dumpfile/$dumpvars 语句)
|
||||
@@ -1,69 +0,0 @@
|
||||
`timescale 1ns/1ps
|
||||
|
||||
module tb_dff_sync_rst;
|
||||
|
||||
// ---- 参数 ----
|
||||
parameter CLK_PERIOD = 10; // 100 MHz 时钟,周期 10ns
|
||||
|
||||
// ---- 信号声明 ----
|
||||
reg clk;
|
||||
reg rst; // 同步复位,高有效
|
||||
reg d;
|
||||
wire q;
|
||||
|
||||
// ---- 被测模块例化 ----
|
||||
dff_sync_rst uut (
|
||||
.clk (clk),
|
||||
.rst (rst),
|
||||
.d (d),
|
||||
.q (q)
|
||||
);
|
||||
|
||||
// ---- 时钟生成 ----
|
||||
initial clk = 0;
|
||||
always #(CLK_PERIOD/2) clk = ~clk;
|
||||
|
||||
// ---- 复位与激励 ----
|
||||
initial begin
|
||||
// 初始化信号
|
||||
rst = 1;
|
||||
d = 0;
|
||||
|
||||
// 复位保持 5 个时钟周期
|
||||
repeat(5) @(posedge clk);
|
||||
rst = 0;
|
||||
|
||||
// 施加激励:交替改变 d,每 2 个周期变一次
|
||||
@(posedge clk); d = 1;
|
||||
@(posedge clk); d = 0;
|
||||
@(posedge clk); d = 1;
|
||||
@(posedge clk); d = 1;
|
||||
@(posedge clk); d = 0;
|
||||
|
||||
// 测试同步复位:在中途再次复位
|
||||
@(posedge clk); rst = 1; d = 1; // 即使 d=1,复位期间 q 应该为 0
|
||||
@(posedge clk);
|
||||
@(posedge clk); rst = 0;
|
||||
|
||||
// 复位后继续激励
|
||||
@(posedge clk); d = 1;
|
||||
@(posedge clk); d = 0;
|
||||
@(posedge clk); d = 1;
|
||||
|
||||
// 等待几个周期后结束
|
||||
repeat(5) @(posedge clk);
|
||||
$finish;
|
||||
end
|
||||
|
||||
// ---- VCD 波形记录 ----
|
||||
initial begin
|
||||
$dumpfile("tb_dff_sync_rst.vcd");
|
||||
$dumpvars(0, tb_dff_sync_rst);
|
||||
end
|
||||
|
||||
// ---- 监控输出(可选,方便在 log 中看到信号变化)----
|
||||
initial begin
|
||||
$monitor("time=%0t clk=%b rst=%b d=%b q=%b", $time, clk, rst, d, q);
|
||||
end
|
||||
|
||||
endmodule
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"eval_id": 2,
|
||||
"eval_name": "eval-fft-iladata",
|
||||
"prompt": "请对这个ILA捕获文件做FFT频谱分析:e:/Xilinx_Design/smod/SMOD_DTMB_CG/my_exciter/ila_dbg/iladata-120m.csv。采样率120MHz,16位数据。",
|
||||
"assertions": [
|
||||
{
|
||||
"text": "Script fft_analyse.py is invoked",
|
||||
"passed": false,
|
||||
"evidence": ""
|
||||
},
|
||||
{
|
||||
"text": "I/Q columns are auto-detected or explicitly identified",
|
||||
"passed": false,
|
||||
"evidence": ""
|
||||
},
|
||||
{
|
||||
"text": "Output PNG or SVG is produced",
|
||||
"passed": false,
|
||||
"evidence": ""
|
||||
},
|
||||
{
|
||||
"text": "--fs 120e6 or equivalent is passed",
|
||||
"passed": false,
|
||||
"evidence": ""
|
||||
},
|
||||
{
|
||||
"text": "Agent reports OBW or peak frequency to user",
|
||||
"passed": false,
|
||||
"evidence": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"eval_id": 2,
|
||||
"eval_name": "eval-fft-iladata",
|
||||
"prompt": "请对这个ILA捕获文件做FFT频谱分析:iladata-120m.csv。采样率120MHz,16位数据。",
|
||||
"assertions": [
|
||||
{
|
||||
"text": "Script fft_analyse.py is invoked",
|
||||
"passed": true,
|
||||
"evidence": "Script ran successfully"
|
||||
},
|
||||
{
|
||||
"text": "I/Q columns are auto-detected correctly",
|
||||
"passed": true,
|
||||
"evidence": "I col: data_120m_i[15:0], Q col: data_120m_q[15:0] — correct"
|
||||
},
|
||||
{
|
||||
"text": "Output PNG or SVG is produced",
|
||||
"passed": true,
|
||||
"evidence": "iladata_120m_v2_*_analysis.png and .svg produced"
|
||||
},
|
||||
{
|
||||
"text": "--fs 120e6 or equivalent is passed",
|
||||
"passed": true,
|
||||
"evidence": "fs: 120.0000 MHz confirmed in output"
|
||||
},
|
||||
{
|
||||
"text": "Agent reports OBW or peak frequency to user",
|
||||
"passed": true,
|
||||
"evidence": "90% OBW: 7.1484 MHz, top peak: -0.9375 MHz at -32.95 dBFS"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 850 KiB |
|
Before Width: | Height: | Size: 265 KiB |
@@ -1,26 +0,0 @@
|
||||
IQ FFT analysis — iladata-120m.csv
|
||||
Run: 20260508_170724
|
||||
I column : data_120m_i[15:0]
|
||||
Q column : data_120m_q[15:0]
|
||||
Fs : 120.0000 MHz
|
||||
FS ref : 32768
|
||||
Samples : 4096 (skipped 0)
|
||||
FFT size : 4096
|
||||
Bin spacing: 29296.8750 Hz
|
||||
I min/max/mean/rms: -8944.0 / 9534.0 / -348.3206 / 2691.2248
|
||||
Q min/max/mean/rms: -10407.0 / 8948.0 / -349.4451 / 2687.5327
|
||||
Mag RMS : 3803.3568
|
||||
90% OBW : 7.148438 MHz (fraction 0.900623)
|
||||
99% OBW : 80.859375 MHz (fraction 0.990004)
|
||||
|
||||
Top spectral peaks:
|
||||
-937500.000 Hz (-0.9375 MHz) -32.95 dBFS amp 737.96
|
||||
-3486328.125 Hz (-3.4863 MHz) -34.08 dBFS amp 647.54
|
||||
1494140.625 Hz (+1.4941 MHz) -35.66 dBFS amp 540.33
|
||||
-820312.500 Hz (-0.8203 MHz) -35.66 dBFS amp 539.87
|
||||
-410156.250 Hz (-0.4102 MHz) -35.79 dBFS amp 531.85
|
||||
996093.750 Hz (+0.9961 MHz) -35.82 dBFS amp 530.23
|
||||
3076171.875 Hz (+3.0762 MHz) -35.83 dBFS amp 529.36
|
||||
-1699218.750 Hz (-1.6992 MHz) -35.99 dBFS amp 519.89
|
||||
1142578.125 Hz (+1.1426 MHz) -36.14 dBFS amp 511.23
|
||||
-732421.875 Hz (-0.7324 MHz) -36.25 dBFS amp 504.31
|
||||
|
Before Width: | Height: | Size: 850 KiB |
|
Before Width: | Height: | Size: 265 KiB |
@@ -1,26 +0,0 @@
|
||||
IQ FFT analysis — iladata-120m.csv
|
||||
Run: 20260508_171512
|
||||
I column : data_120m_i[15:0]
|
||||
Q column : data_120m_q[15:0]
|
||||
Fs : 120.0000 MHz
|
||||
FS ref : 32768
|
||||
Samples : 4096 (skipped 0)
|
||||
FFT size : 4096
|
||||
Bin spacing: 29296.8750 Hz
|
||||
I min/max/mean/rms: -8944.0 / 9534.0 / -348.3206 / 2691.2248
|
||||
Q min/max/mean/rms: -10407.0 / 8948.0 / -349.4451 / 2687.5327
|
||||
Mag RMS : 3803.3568
|
||||
90% OBW : 7.148438 MHz (fraction 0.900623)
|
||||
99% OBW : 80.859375 MHz (fraction 0.990004)
|
||||
|
||||
Top spectral peaks:
|
||||
-937500.000 Hz (-0.9375 MHz) -32.95 dBFS amp 737.96
|
||||
-3486328.125 Hz (-3.4863 MHz) -34.08 dBFS amp 647.54
|
||||
1494140.625 Hz (+1.4941 MHz) -35.66 dBFS amp 540.33
|
||||
-820312.500 Hz (-0.8203 MHz) -35.66 dBFS amp 539.87
|
||||
-410156.250 Hz (-0.4102 MHz) -35.79 dBFS amp 531.85
|
||||
996093.750 Hz (+0.9961 MHz) -35.82 dBFS amp 530.23
|
||||
3076171.875 Hz (+3.0762 MHz) -35.83 dBFS amp 529.36
|
||||
-1699218.750 Hz (-1.6992 MHz) -35.99 dBFS amp 519.89
|
||||
1142578.125 Hz (+1.1426 MHz) -36.14 dBFS amp 511.23
|
||||
-732421.875 Hz (-0.7324 MHz) -36.25 dBFS amp 504.31
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"eval_id": 1,
|
||||
"eval_name": "eval-fft-sim-output",
|
||||
"prompt": "帮我分析这个仿真输出文件的IQ频谱:e:/Xilinx_Design/smod/SMOD_DTMB_CG/my_exciter/sim-dbg/output_iq.txt。采样率是245.76MHz,数据是24位有符号整数,I列是m_i_dec,Q列是m_q_dec。跳过前50个样本(FIR启动)。频率显示范围 -70到70MHz。输出到 e:/Xilinx_Design/smod/SMOD_DTMB_CG/my_exciter/sim-dbg/eval_out/",
|
||||
"assertions": [
|
||||
{
|
||||
"text": "Script fft_analyse.py is invoked via the full Python path",
|
||||
"passed": false,
|
||||
"evidence": ""
|
||||
},
|
||||
{
|
||||
"text": "Output PNG file is produced in the specified output directory",
|
||||
"passed": false,
|
||||
"evidence": ""
|
||||
},
|
||||
{
|
||||
"text": "Summary TXT is produced and contains OBW value",
|
||||
"passed": false,
|
||||
"evidence": ""
|
||||
},
|
||||
{
|
||||
"text": "Correct CLI flags used: --fs 245.76e6, --bits 24, --i-col m_i_dec, --q-col m_q_dec, --skip 50, --xlim -70,70",
|
||||
"passed": false,
|
||||
"evidence": ""
|
||||
},
|
||||
{
|
||||
"text": "Agent reports 99% OBW value to user",
|
||||
"passed": false,
|
||||
"evidence": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"eval_id": 1,
|
||||
"eval_name": "eval-fft-sim-output",
|
||||
"prompt": "帮我分析这个仿真输出文件的IQ频谱:output_iq.txt。采样率245.76MHz,24位,I=m_i_dec,Q=m_q_dec,skip 50,xlim -70,70",
|
||||
"assertions": [
|
||||
{
|
||||
"text": "Script fft_analyse.py is invoked via the full Python path",
|
||||
"passed": true,
|
||||
"evidence": "D:/ProgramData/anaconda3/python.exe .../fft_analyse.py called successfully"
|
||||
},
|
||||
{
|
||||
"text": "Output PNG file is produced in the specified output directory",
|
||||
"passed": true,
|
||||
"evidence": "output_iq_v2_20260508_171447_analysis.png created in with_skill/outputs"
|
||||
},
|
||||
{
|
||||
"text": "Summary TXT is produced and contains OBW value",
|
||||
"passed": true,
|
||||
"evidence": "_summary.txt produced; 99% OBW = 7.9200 MHz"
|
||||
},
|
||||
{
|
||||
"text": "Correct CLI flags: --fs 245.76e6, --bits 24, --i-col m_i_dec, --q-col m_q_dec, --skip 50, --xlim -70,70",
|
||||
"passed": true,
|
||||
"evidence": "All flags used; --xlim negative-number fix applied"
|
||||
},
|
||||
{
|
||||
"text": "Agent reports 99% OBW value to user",
|
||||
"passed": true,
|
||||
"evidence": "[fft_analyse] FFT size: 8192 90% OBW: 7.1400 MHz 99% OBW: 7.9200 MHz"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 608 KiB |
|
Before Width: | Height: | Size: 389 KiB |
@@ -1,26 +0,0 @@
|
||||
IQ FFT analysis — output_iq.txt
|
||||
Run: 20260508_171447
|
||||
I column : m_i_dec
|
||||
Q column : m_q_dec
|
||||
Fs : 245.7600 MHz
|
||||
FS ref : 8388608
|
||||
Samples : 9205 (skipped 50)
|
||||
FFT size : 8192
|
||||
Bin spacing: 30000.0000 Hz
|
||||
I min/max/mean/rms: -704738.0 / 750807.0 / -12645.9529 / 195925.8821
|
||||
Q min/max/mean/rms: -818645.0 / 705200.0 / -12236.1191 / 195581.3542
|
||||
Mag RMS : 276837.5289
|
||||
90% OBW : 7.140000 MHz (fraction 0.917248)
|
||||
99% OBW : 7.920000 MHz (fraction 0.992372)
|
||||
|
||||
Top spectral peaks:
|
||||
-960000.000 Hz (-0.9600 MHz) -43.23 dBFS amp 57820.48
|
||||
-3570000.000 Hz (-3.5700 MHz) -44.55 dBFS amp 49657.53
|
||||
1530000.000 Hz (+1.5300 MHz) -45.59 dBFS amp 44053.51
|
||||
1020000.000 Hz (+1.0200 MHz) -45.96 dBFS amp 42259.76
|
||||
3150000.000 Hz (+3.1500 MHz) -46.03 dBFS amp 41916.88
|
||||
-1740000.000 Hz (-1.7400 MHz) -46.05 dBFS amp 41821.55
|
||||
-840000.000 Hz (-0.8400 MHz) -46.07 dBFS amp 41707.34
|
||||
-420000.000 Hz (-0.4200 MHz) -46.12 dBFS amp 41473.83
|
||||
1170000.000 Hz (+1.1700 MHz) -46.32 dBFS amp 40531.65
|
||||
-750000.000 Hz (-0.7500 MHz) -46.71 dBFS amp 38730.41
|
||||
@@ -1,27 +0,0 @@
|
||||
{
|
||||
"eval_id": 3,
|
||||
"eval_name": "eval-fft-vague",
|
||||
"prompt": "我有一个CSV文件 e:/Xilinx_Design/smod/SMOD_DTMB_CG/my_exciter/sim-dbg/output_iq.txt,帮我画个频谱图,采样率 245.76e6,24位",
|
||||
"assertions": [
|
||||
{
|
||||
"text": "Script fft_analyse.py is invoked despite vague request phrasing",
|
||||
"passed": false,
|
||||
"evidence": ""
|
||||
},
|
||||
{
|
||||
"text": "Output spectrum PNG is produced",
|
||||
"passed": false,
|
||||
"evidence": ""
|
||||
},
|
||||
{
|
||||
"text": "--fs 245.76e6 and --bits 24 are passed correctly",
|
||||
"passed": false,
|
||||
"evidence": ""
|
||||
},
|
||||
{
|
||||
"text": "Agent summarizes results to user",
|
||||
"passed": false,
|
||||
"evidence": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"eval_id": 3,
|
||||
"eval_name": "eval-fft-vague",
|
||||
"prompt": "我有一个CSV文件 output_iq.txt,帮我画个频谱图,采样率 245.76e6,24位",
|
||||
"assertions": [
|
||||
{
|
||||
"text": "Script fft_analyse.py is invoked despite vague request phrasing",
|
||||
"passed": true,
|
||||
"evidence": "Script invoked with minimal args"
|
||||
},
|
||||
{
|
||||
"text": "Output spectrum PNG is produced",
|
||||
"passed": true,
|
||||
"evidence": "output_iq_vague_v2_*_analysis.png created"
|
||||
},
|
||||
{
|
||||
"text": "--fs 245.76e6 and --bits 24 are passed correctly",
|
||||
"passed": true,
|
||||
"evidence": "fs: 245.7600 MHz, FS ref: 8388608 (= 2^23 for 24-bit)"
|
||||
},
|
||||
{
|
||||
"text": "Auto-detection picks _dec columns, not _hex columns (bug fix verified)",
|
||||
"passed": true,
|
||||
"evidence": "I col: m_i_dec, Q col: m_q_dec — correct after fix"
|
||||
},
|
||||
{
|
||||
"text": "Agent summarizes results to user",
|
||||
"passed": true,
|
||||
"evidence": "90% OBW: 7.1400 MHz, 99% OBW: 7.9200 MHz, top peak -0.9600 MHz"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 715 KiB |
|
Before Width: | Height: | Size: 459 KiB |
@@ -1,26 +0,0 @@
|
||||
IQ FFT analysis — output_iq.txt
|
||||
Run: 20260508_170801
|
||||
I column : m_i_24b_hex
|
||||
Q column : m_q_24b_hex
|
||||
Fs : 245.7600 MHz
|
||||
FS ref : 8388608
|
||||
Samples : 9202 (skipped 53)
|
||||
FFT size : 8192
|
||||
Bin spacing: 30000.0000 Hz
|
||||
I min/max/mean/rms: -704738.0 / 750807.0 / -20877.9587 / 189716.6126
|
||||
Q min/max/mean/rms: -818645.0 / 705200.0 / -21138.8261 / 188461.3503
|
||||
Mag RMS : 267413.6751
|
||||
90% OBW : 7.440000 MHz (fraction 0.907568)
|
||||
99% OBW : 222.120000 MHz (fraction 0.990001)
|
||||
|
||||
Top spectral peaks:
|
||||
-960000.000 Hz (-0.9600 MHz) -43.74 dBFS amp 54530.19
|
||||
-3570000.000 Hz (-3.5700 MHz) -45.33 dBFS amp 45402.29
|
||||
3150000.000 Hz (+3.1500 MHz) -46.32 dBFS amp 40515.12
|
||||
-840000.000 Hz (-0.8400 MHz) -46.43 dBFS amp 40024.38
|
||||
-1740000.000 Hz (-1.7400 MHz) -46.44 dBFS amp 39961.91
|
||||
1020000.000 Hz (+1.0200 MHz) -46.50 dBFS amp 39705.47
|
||||
1530000.000 Hz (+1.5300 MHz) -46.53 dBFS amp 39559.91
|
||||
-420000.000 Hz (-0.4200 MHz) -46.79 dBFS amp 38388.14
|
||||
1170000.000 Hz (+1.1700 MHz) -46.81 dBFS amp 38293.45
|
||||
-750000.000 Hz (-0.7500 MHz) -47.29 dBFS amp 36236.38
|
||||
|
Before Width: | Height: | Size: 585 KiB |
|
Before Width: | Height: | Size: 395 KiB |
@@ -1,26 +0,0 @@
|
||||
IQ FFT analysis — output_iq.txt
|
||||
Run: 20260508_171530
|
||||
I column : m_i_dec
|
||||
Q column : m_q_dec
|
||||
Fs : 245.7600 MHz
|
||||
FS ref : 8388608
|
||||
Samples : 9202 (skipped 53)
|
||||
FFT size : 8192
|
||||
Bin spacing: 30000.0000 Hz
|
||||
I min/max/mean/rms: -704738.0 / 750807.0 / -12650.0756 / 195957.8170
|
||||
Q min/max/mean/rms: -818645.0 / 705200.0 / -12240.1082 / 195613.2329
|
||||
Mag RMS : 276882.6519
|
||||
90% OBW : 7.140000 MHz (fraction 0.917276)
|
||||
99% OBW : 7.920000 MHz (fraction 0.992374)
|
||||
|
||||
Top spectral peaks:
|
||||
-960000.000 Hz (-0.9600 MHz) -43.23 dBFS amp 57835.11
|
||||
-3570000.000 Hz (-3.5700 MHz) -44.55 dBFS amp 49670.03
|
||||
1530000.000 Hz (+1.5300 MHz) -45.59 dBFS amp 44079.29
|
||||
1020000.000 Hz (+1.0200 MHz) -45.95 dBFS amp 42277.57
|
||||
3150000.000 Hz (+3.1500 MHz) -46.03 dBFS amp 41903.29
|
||||
-1740000.000 Hz (-1.7400 MHz) -46.05 dBFS amp 41796.00
|
||||
-840000.000 Hz (-0.8400 MHz) -46.07 dBFS amp 41684.76
|
||||
-420000.000 Hz (-0.4200 MHz) -46.12 dBFS amp 41459.15
|
||||
1170000.000 Hz (+1.1700 MHz) -46.32 dBFS amp 40537.70
|
||||
-750000.000 Hz (-0.7500 MHz) -46.70 dBFS amp 38766.42
|
||||