热度 1| |
声明,不得转载。
像很多公司芯片一样,该小型DUT有基本的寄存器配置总线。在该DUT中寄存器配置总线信号也就是bus_cmd_valid,bus_op,bus_addr,bus_wr_data和bus_rd_data,这些信号是类似AMBA等协议的关键信号。在真正的芯片soc中,IP与IP之间的通信是需要接口协议的,这些接口协议是一套标准,也就是发送读写地址和数据是有一套时序逻辑关系的,该DUT也有一套简单的寄存器配置总线,可以很好地学习一下。该DUT内部的寄存器invert,它能影响DUT的功能。invert是一个1位的寄存器,为其分配了地址16‘h9。它的值为1,DUT输出时会将输入的数据取反;为0时,会将输入数据直接发送出去。
invert可以通过总线bus_*进行配置,bus_op为1时表示写操作,为0时表示读操作。bus_addr表示地址,bus_rd_data表示读取的数据,bus_wr_data表示要写入的数据。在clk上升沿到来时,bus_cmd_valid和bus_op都为1时,写入数据到寄存器invert上。在clk上升沿到来时,bus_cmd_valid和bus_op分别为1和0时,读出invert中的寄存器值到bus_rd_data上。
在编写这个DUT的验证环境的时候,由于寄存器invert是DUT的内部寄存器,并不是输入信号,在例化DUT的时候,DUT上的信号是看不到invert的,也就是说在与DUT连接的interface上是看不到寄存器invert的。但是给输入信号rxd值和输入信号rx_dv值之前,验证环境首先要考虑配置好该内部寄存器invert,由于在interface上看不到该内部寄存器,我们就不能像给输入信号rxd值和输入信号rx_dv值一样,在driver上直接把数据放到与DUT连接的interface上。在interface上我们可以看到bus_*配置总线,这样我们可以写个driver,去驱动这些配置总线bus_*,相应的也就配置好了DUT的内部寄存器invert。内部寄存器invert是一个很重要的信号,在uvm的验证reference中,构建参考模型的时候,也要知道该内部寄存器invert的值,然后才可以把输入信号rxd值和输入信号rx_dv根据invert的值选择相应的方式,模拟DUT的功能。为了更方便的在reference读出DUT内部的寄存器invert的值,可以使用UVM的寄存器模型。
微信号:chipist1 ,添加微信交流技术以及找工作
内推大公司:海光, AMD, 兆芯,苏州瑞晟微电子,苏州盛科网络,TI,杭州矽力杰等等。
招聘:上海,深圳,珠海,广州,成都,杭州,苏州,北京,西安,数字ic设计工程师,数字验证工程师,模拟ic设计工程师,DFT,FPGA,数字后端工程师,RFIC,射频工程师,ae,fae,sales。总有一款适合你,欢迎ICer自荐和推荐。
1、模拟IC设计工程师25-80W(电源方向:初级、高工、经理、总监)均有需求,坐标:深圳/上海/武汉/长沙/南京/苏州/昆山/杭州/成都/西安/北京/厦门。
2、资深模拟IC设计(混合信号),30-100W, 坐标:上海/南京/深圳/昆山/成都/重庆/西安/武汉/珠海/广州/昆山。
3、资深数字IC设计工程师-------苏州、上海、北京、杭州、武汉、成都、西安、四川、广州、深圳、珠海、昆山;
4、数字IC设计前端/后端 工程师-四川/武汉、上海、北京、广州、昆山;
5、FPGA-西安/上海;
6、RFIC资深/专家/VP,射频工程师 -杭州/上海、重庆、成都、深圳、西安、北京、。
7、FAE/AE-武汉/上海/深圳/昆山/厦门;
8、模拟版图设计工程师-武汉/上海/深圳/成都/厦门。
备注:初创型、成熟型、国企、外资企业、甚至合伙人岗位应有尽有。
另外,上海/苏州/成都/昆山分别有数字经理、模拟(ADC/DAC)(DC/DC)(AC/DC)经理
欢迎自荐和推荐(同学/朋友/同事)。谢谢啦!
module dut (clk,rst_n,bus_cmd_valid,bus_op,bus_addr,bus_wr_data,bus_rd_data,rxd,rx_dv,txd,tx_en);
input clk;
input rst_n;
input bus_cmd_valid;
input bus_op;
input [15:0] bus_addr;
input [15:0] bus_wr_data;
output [15:0] bus_rd_data;
input [7:0] rxd;
input rx_dv;
output [7:0] txd;
output tx_en;
reg [7:0] txd;
reg tx_en;
reg invert;
always @(posedge clk) begin
if(!rst_n) begin
txd<=8’b0;
tx_en<=1’b0;
end
else if (invert) begin
txd<=~rxd;
tx_en<=rx_dv;
end
else begin
txd<=rxd;
tx_en<=rx_dv;
end
always (posedge clk) begin
if(!rst_n)
invert <=1’b0;
else if (bus_cmd_valid &&bus_op) begin
case (bus_addr)
16’h9: begin
Invert <=bus_wr_data[0];
end
default :begin
end
endcase
end
end
reg [15:0] bus_rd_data;
always @(posedge clk) begin
if(!rst_n)
bus_rd_data<=16’h0;
else if (bus_cmd_valid&&!bus_op) begin
case (bus_addr)
16’h9: begin
bus_rd_data<={15’b0,invert};
end
default:begin
bus_rd_data<=16’b0;
end
endcase
end
end
endmodule